【c++】vector用法详解

vector用法详解

  • vector定义
  • vector容器的构造函数
  • vector容器内元素的访问
    • 1.通过下标 + [ ]来访问
    • 2.通过迭代器来访问
    • 3.通过范围for来访问
  • vector常用函数的用法解析
    • 1.size()
    • 2.clear()
    • 3.capacity()
    • 4.reserve()
    • 5.resize()
    • 6.shrink_to_fit()
    • 7.pop_back()
    • 8.push_back()
    • 9.erase()
    • 10.insert()
      • 补充:算法库中的find()
    • 11.vector iterator适用
      • 1. begin() + end()
      • 2.rbegin() + rend()

铁汁们,今天给大家分享一篇vector用法详解,来吧,开造⛳️

vector定义

💡 vector< typename> name ;

  • vector本质是顺序表,是可以更改大小的"变长数组"。

  • typename为任意类型,例如:int、char、double、string、vector。

💡 Tips:vector是可变大小数组的序列容器。vector使用动态分配数组来存储它的元素,物理空间连续,可以采用下标+[ ]对vector中的元素进行访问。在末尾插入或者删除一个元素时间复杂度为O(1),效率高,而在其他位置处进行插入或者删除一个元素时间复杂度为O(n),效率低,而对于其他物理空间不连续的容器采用迭代器或者引用的方式来访问元素效率高。

vector容器的构造函数

  • 1.构造一个没有元素的空数组a, 元素类型为typename。

💡1. vector a ;

  • 2.构造一个与容器c内元素相同的数组d, 元素类型为typename。

💡2.vector d(const vector& c) ;

  • 3.构造一个与[first, last)范围一样多元素的容器c。

💡3.vector c(iterator first, iterator last ) ;

  • 4.构造一个包含n个元素,每个元素的值为val的数组b, 元素类型为typename。

💡4.vector b(size_t n, const typename& val ) ;

#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include<vector>
#include<string>using namespace std;int main()
{vector<int> a;for (auto it : a){cout << it << ' ';}vector<int> b(5, 1);for (auto it : b){cout << it << ' ';}cout << endl;string s("abcd");vector<int> c(s.begin(), s.end());//编码表-字符与ASCII值对应的表,内存中实际存储的是字符所对应的ASCII值for (auto it : c){cout << it << ' ';}cout << endl;vector<int> d(b);for (auto it : d){cout << it << ' ';}return 0;
}

在这里插入图片描述

vector容器内元素的访问

1.通过下标 + [ ]来访问

for (int i = 0; i < v.size(); i++){cout << v[i] << ' ';
}
cout << endl;

2.通过迭代器来访问

vector<int>::iterator it = v.begin();
while (it != v.end())
{cout << *it << ' ';it++;
}
cout << endl;

3.通过范围for来访问

for (auto it : v) //只要该容器支持迭代器,就支持范围for,原因:范围for的底层实现为迭代器
{cout << it << ' ';
}
cout << endl;

💡 Tips:只要某个容器支持迭代器,就支持范围for, 原因:范围for的底层实现为迭代器。

vector常用函数的用法解析

1.size()

💡 1.size_t size( )const ;

  • 功能:获得vector中元素的总个数,元素类型为typename。
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include<vector>using namespace std;int main()
{vector<string> v1(5, "1111"); //cout << v1.size() << endl;vector<int> v2;v2.push_back(1);v2.push_back(2);v2.push_back(3);vector<int> v3(v2.begin() + 1, v2.end());cout << v2.size() << endl << v3.size() << endl;return 0;
}

在这里插入图片描述

2.clear()

💡2.void clear( ) ;

  • 功能:使vector中元素的总个数size变为0,但容量capacity不变。
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include<vector>using namespace std;int main()
{vector<int> v(4, 2);cout << v.size() << ' ' << v.capacity() << endl;v.clear();cout << v.size() << ' ' << v.capacity() << endl;return 0;
}

在这里插入图片描述

3.capacity()

💡3.size_t capacity( )const ;

  • 功能:获得当前分配给vector存储空间的大小。
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include<vector>using namespace std;int main()
{vector<int> v; //测试vs下vector默认的扩容机制 -》1.5倍size_t sz = v.capacity();cout << "start capacity:" << sz << endl;for (size_t i = 0; i < 100; i++){v.push_back(i);if (sz != v.capacity()){sz = v.capacity();cout << "changed capacity:" << sz << endl;}}return 0;
}

在这里插入图片描述

💡 Tips:在vs下capacity呈1.5倍增长的,vs是PJ版本的STL、在g++(linux)下capacity呈2倍增长的,g++是 SGI版本的STL。vector的增容,具体增多少,不能固化,在不同编译器下增容的定义是不同的。

4.reserve()

4.void reserve(size_t n) ;

  • 功能:使得vector容器存储空间的大小为n。
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include<vector>using namespace std;int main()
{vector<int> v;for (size_t i = 1; i < 15; i++)v.push_back(i);cout << v.size() << ' ' << v.capacity() << endl;v.reserve(16); //情况一: size < n < capacity ->size不变,capacity不变cout << v.size() << ' ' << v.capacity() << endl;v.reserve(22); //情况二: n > capacity  ->size不变,capacity改变,扩容cout << v.size() << ' ' << v.capacity() << endl;for (auto it : v){cout << it << ' ';}cout << endl;v.reserve(5); //情况三: size > n ->size改变,size不变,capacity不变cout << v.size() << ' ' << v.capacity() << endl;return 0;
}
  • 相当于扩容,不会初始化。

  • 不会改变数据,只会改变容量。当n < size 或 size < n < capacity,在vs下不会缩容,在g++下会缩容。

  • reserve(n),是否会开辟n个空间,取决于编译器,仅仅是向编译器做了个请求工作。

  • 已知需开辟空间的大小为n,可以使用reserve(n),从而减少扩容的次数,提高效率,因为扩容有损耗。

在这里插入图片描述

5.resize()

💡5.void resize(size_t n, const typename& val = typename( ) ) ;

  • 功能:调整vector容器的大小,使其内元素个数变为n。
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include<vector>using namespace std;int main()
{vector<int> v;for (size_t i = 1; i < 15; i++)v.push_back(i);cout << v.size() << ' ' << v.capacity() << endl;v.resize(16); //情况一: size < n < capacity ->size改变,capacity不变,插入数据cout << v.size() << ' ' << v.capacity() << endl;v.resize(22); //情况二: n > capacity  ->size改变,capacity改变,扩容+插入数据cout << v.size() << ' ' << v.capacity() << endl;for (auto it : v){cout << it << ' ';}cout << endl;return 0;}v.resize(5); //情况三: size > n ->size改变,capacity不变,删除数据cout << v.size() << ' ' << v.capacity() << endl;return 0;
}

在这里插入图片描述

  • 相当于扩容 + 初始化。
  • 既改变容量,又改变数据。当n < size 或 size < n < capacity,在vs下不会缩容,在g++下会缩容。
  • 情况一: size > n ->size改变,capacity不变,删除数据 ;情况二: size < n < capacity
    ->size改变,capacity不变,插入数据 ; 情况三: n > capacity ->size改变,capacity改变,扩容+插入数据 。
  • 初始化处默认给缺省值,缺省值为无参构造函数,自定义类型会去调它自己的默认构造函数,c++11为了兼容模板,使得内置类型也有构造函数,内置类型得无参构造函数初始化为0eg:int
    val = int(), val = 0、double val = double(),val = 0.0,int* val =
    int*() , val = nullptr、char val = char(), val = ‘\0’。

6.shrink_to_fit()

💡void shrink_to_fit( ) ;

  • 功能:缩容,使capacity()减小到与size()大小相同。
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include<vector>using namespace std;int main()
{vector<int> v;for (size_t i = 1; i < 15; i++)v.push_back(i);cout << v.size() << ' ' << v.capacity() << endl;v.resize(5);cout << v.size() << ' ' << v.capacity() << endl;v.shrink_to_fit();cout << v.size() << ' ' << v.capacity() << endl;return 0;
}

在这里插入图片描述

7.pop_back()

💡void pop_back( ) ;

  • 功能:删除最后一个元素。
  • 8.push_back()

💡void push_back( ) ;

  • 功能:在末尾插入一个元素。
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include<vector>using namespace std;int main()
{vector<int> v;v.push_back(1);v.push_back(2);v.push_back(3);for (auto it : v){cout << it << ' ';}cout << endl;v.pop_back();for (auto it : v){cout << it << ' ';}cout << endl;return 0;
}

在这里插入图片描述

9.erase()

💡void erase(iterator position) ;

  • 功能:删除指定位置(迭代器)处的值。
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include<vector>using namespace std;int main()
{vector<int> v;v.push_back(1);v.push_back(2);v.push_back(3);v.erase(v.begin() + 1);for (auto it : v){cout << it << ' ';}cout << endl;return 0;
}

在这里插入图片描述

10.insert()

💡void insert(iterator position , const typename& x) ;

  • 功能:在指定的位置(迭代器)前插入元素x。

💡void insert(iterator position , iterator first , iterator end) ;

  • 功能: 在指定位置(迭代器)前插入与范围[first , end)一样多元素的容器

补充:算法库中的find()

💡iterator find(iterator first, iterator end, const typename& x) ;

  • 功能:在范围[first, end)容器中查找与x相同的元素,若查找到了,则返回查找到的元素所在的位置(迭代器),否则返回end(迭代器)。
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include<vector>
#include<algorithm>using namespace std;int main()
{vector<int> v1(5, 2);vector<int> v2(3, 6);v1.insert(v1.begin() + 2, 3);v1.insert(v1.begin(), v2.begin(), v2.end());for (auto it : v1){cout << it << ' ';}cout << endl;vector<int>::iterator p = find(v1.begin() + 1, v1.end(), 3);if (p != v1.end())cout << "查找到了" << endl;elsecout << "查找不到" << endl;return 0;
}

在这里插入图片描述

  • 头文件为#include。
  • 是函数模板,泛型编程,不是针对于某个容器的迭代器实现的,而是针对于所有容器的迭代器实现的。

11.vector iterator适用

1. begin() + end()

💡iterator begin( )、const_iterator begin( )const

  • 功能:返回第一个元素的位置(迭代器)。

Tips:const_iterator 修饰的是迭代器所指向的元素不能被修改,而迭代器本身可以被修改。const修饰this指针,表示在该成员函数中成员变量不允许被修改,此处const的用法只能用于类中的成员函数。

💡iterator end( )、const_iterator end( )const ;

  • 功能:返回最后一个元素的下一个位置(迭代器)。

2.rbegin() + rend()

💡iterator rbegin( )、const_iterator rbegin( )const ;

  • 功能:返回最后一个元素的位置(迭代器)。

💡iterator rend( )、const_iterator rend( )const ;

  • 功能:返回第一个元素的前一个位置(迭代器)。
    在这里插入图片描述

铁铁们,vector用法详解就到此结束啦,若博主有不好的地方,请指正,欢迎铁铁们留言,请动动你们的手给作者点个👍鼓励吧,你们的鼓励就是我的动力✨

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/666200.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python基于django的公交线路查询系统mf383

1.个人信息的管理&#xff1a;对用户名&#xff0c;密码的增加、删除等 2.线路信息的管理&#xff1a;对线路的增加、修改、删除等 3.站点信息的管理&#xff1a;对站点的增加、修改、删除等 4.车次信息的管理&#xff1a;对车次的增加、修改、删除等 5.线路查询、站点查询 …

已解决: ModuleNotFoundError: No module named ‘tensorflow‘ 问题

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …

nba2k24 球魁面补【23-24通用】

nba2k24 球魁面补 nba2k23-nba2k24通用 球魁面补 下载地址&#xff1a; https://www.changyouzuhao.cn/9841.html

蓝桥杯省赛无忧 课件91 高斯消元

01 算法概述 02 问题引入 03 算法分析 04 例题

Linux 多线程 | 线程的概念

线程的概念 线程是一个执行分支&#xff0c;执行粒度比进程更细&#xff0c;调度成本更低&#xff1b; 线程是进程内部的一个执行流&#xff1b; 线程是CPU调度的基本单位&#xff0c;进程是承担分配系统资源的基本实体。 之前我们学习过虚拟地址空间的知识&#xff0c;知道…

NetSuite 权限不足用户如何查询完整数据

假设我们做了一个Saved Search&#xff0c;用于统计所有涉及库存的事务类型&#xff0c;包括出入库、库存调整、生产报工、拆解、Standalone Invoice和Bill&#xff0c;等等。通过合计这些事务类型&#xff0c;我们就可以得到一个存货报表&#xff0c;能够得到任一时间点的库存…

线程同步解析

一 线程同步 1 同步的意义 现实中抢票可能没票了还在抢票&#xff0c;然后线程就会一直在加锁解锁&#xff0c;就会导致其它线程抢不到锁而产生饥饿问题&#xff0c;我们前面也提过usleep就是让线程被切换&#xff0c;能让其它线程去申请锁&#xff0c;这种方式并不好&#xf…

蓝桥杯备战——13.PCF8591芯片的使用

目录 1.芯片简介2.读写时序3.控制字4.代码封装库5.原理图分析6.使用示例 1.芯片简介 截取自NXP的PCF8591芯片数据手册&#xff0c;我把重点关注部分划出来了&#xff0c;请务必自行阅读一遍数据手册&#xff01; 2.读写时序 ①器件地址&#xff1a; Bit0决定是读还是写操作&…

最新GPT4.0使用教程,AI绘画,GPT语音对话使用,DALL-E3文生图

一、前言 ChatGPT3.5、GPT4.0、GPT语音对话、Midjourney绘画&#xff0c;文档对话总结DALL-E3文生图&#xff0c;相信对大家应该不感到陌生吧&#xff1f;简单来说&#xff0c;GPT-4技术比之前的GPT-3.5相对来说更加智能&#xff0c;会根据用户的要求生成多种内容甚至也可以和…

优质成长:新生儿补充维生素B6的关键注意事项

引言&#xff1a; 维生素B6&#xff0c;作为B族维生素的一员&#xff0c;对于新生儿的神经系统发育和代谢功能至关重要。本文将深入探讨维生素B6的作用、新生儿补充的必要性&#xff0c;以及在补充维生素B6时应该注意的事项&#xff0c;为父母提供科学、全面的育儿指南。 第一…

WebChat——一个开源的聊天应用

Web Chat 是开源的聊天系统&#xff0c;支持一键免费部署私人Chat网页的应用程序。 目录树 TOC &#x1f44b;&#x1f3fb; 开始使用 & 交流&#x1f6f3; 开箱即用 A 使用 Docker 部署B 使用 Docker-compose 部署C 使用 Jar包 本地部署 ⌨️ 本地开发&#x1f91d; 参与…

开源浏览器Firefox:使用Docker本地部署并远程访问进行测试

&#x1f308;个人主页&#xff1a;聆风吟 &#x1f525;系列专栏&#xff1a;网络奇遇记、数据结构 &#x1f516;少年有梦不应止于心动&#xff0c;更要付诸行动。 文章目录 &#x1f4cb;前言一. 部署Firefox二. 本地访问Firefox三. Linux安装Cpolar四. 配置Firefox公网地址…

网络原理-TCP/IP(5)

TCP协议 延迟应答 它也是基于滑动窗口,提高效率的一种机制,结合滑动窗口以及流量控制,能够以延迟应答ACK的方式,把反馈的窗口,搞大.核心在于允许范围内,让窗口尽可能大. 如果接收数据的主机立刻返回ACK应答,这时候返回的窗口可能比较小. 1.假设接收端缓冲区为1M.一次收到了5…

树状数组相关

前置细节 &#xff0c;得到转二进制后&#xff0c;从右往左数第一个1与之前所有的0构成数树状数组最终形成如上图结构维护的是的信息&#xff0c;如即到上层&#xff0c;包含当前区间的大区间&#xff0c;如即到同一层的前一个&#xff0c;与当前区间无关的另一同等大小的区间…

第十二讲_JavaScript浏览器对象模型BOM

JavaScript浏览器对象模型BOM 1. 浏览器对象模型介绍2. location2.1 常用的属性2.2 常用的方法 3. navigator3.1 常用的属性 4. history4.1 常用的方法&#xff1a; 5. 本地存储 1. 浏览器对象模型介绍 BOM(Browser Object Model) 是指浏览器对象模型&#xff0c;浏览器对象模…

Git--07--GitExtension

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、GitExtension下载GitExtension官网下载教程 二、GitExtension安装三、GitExtension配置四、GitExtension使用 一、GitExtension下载 官网下载&#xff1a; http…

Hive 主要内容一览

Hive架构 用户接口&#xff1a;Client CLI&#xff08;command-line interface&#xff09;、JDBC/ODBC(jdbc访问hive) 元数据&#xff1a;Metastore 元数据包括&#xff1a;表名、表所属的数据库&#xff08;默认是default&#xff09;、表的拥有者、列/分区字段、表的类型&am…

Mybatis基础教程及使用细节

本篇主要对Mybatis基础使用进行总结&#xff0c;包括Mybatis的基础操作&#xff0c;使用注解进行增删改查的练习&#xff1b;详细介绍xml映射文件配置过程并且使用xml映射文件进行动态sql语句进行条件查询&#xff1b;为了简化java开发提高效率&#xff0c;介绍一下依赖&#x…

【chisel】 环境,资料

Chisel环境搭建教程&#xff08;Ubuntu&#xff09; 根据上边的link去安装&#xff1b; 目前scala最高版本用scala-2.13.10,太高了 没有chisel的库文件支持&#xff1b;会在sbt下载的过程中报错&#xff1b; [error] sbt.librarymanagement.ResolveException: chisel chisel目…

爬虫学习笔记-scrapy安装及第一个项目创建问题及解决措施

1.安装scrapy pycharm终端运行 pip install scrapy -i https://pypi.douban.com/simple 2.终端运行scrapy startproject scrapy_baidu,创建项目 问题1:lxml版本低导致无法找到 解决措施:更新或者重新安装lxml 3.项目创建成功 4.终端cd到项目的spiders文件夹下,cd scra…