stl容器 vector的基本操作

news2025/1/20 19:55:42

目录

1.vector构造

1.1默认构造函数

1.2 fill  填充构造函数 

​编辑 1.3 范围构造函数(Range Constructor)

 1.4拷贝构造函数

2.initializer_list初始化vector

3.迭代器 

4.常用的几个成员

 4.1  size()统计当前有效字符个数

4.2   capacity    vector容器当前空间大小

6.插入和删除 

6.1push_back(尾插)pop_back(尾删)

5.遍历

普通数组方式遍历

迭代器访问遍历

范围for遍历

6.2insert和erase

(1)insert

(2)erase 

7.vector的容量操作 

 resize函数

 reserve函数

8.vector::at与方括号访问方式


1.vector构造

1.1默认构造函数

vector<int>是vector类模版类型,尖括号里的类型是指生成什么类型的vector的类,实质上vector可以看做一个数组,vector<int>实质上就是生成了一个存int类型的数组,而tamp是这个数组的名字。这样默认构造是默认构造了一个空的vector数组,类型不是int,而是vector<int>

因为是尖括号里是模板所以也可以使用别的类型来构造函数,比如string,这样生成的就是string类型的数组了 

 同样也可以嵌套使用,比如vector<int>构成的是int类型的数组,而尖括号里面是填模板类型,所以vector<int>类型也可以,写成vector<vector<int>>,数组里面存的是数组,这样就构成了一个二维数组

1.2 fill  填充构造函数 

原型为

填充构造函数就是用n个类型的数据构造vector

比如vector<int> tamp(5,2);

就是用5个2去构造vector,与默认构造函数相比此时不再是空的vector,而是里面被2填充

因为vector是数组所以可以直接用方括号访问的方式打印一下

 除了内置类型,它也可以用自定义类型来填充初始化vector

 

甚至可以直接这样写,用string匿名对象来构造vector

 1.3 范围构造函数(Range Constructor)

范围构造就是利用另一个容器的迭代器来完成构造

比如利用string的迭代器来构造vector

同样也可以通过另一个vector的迭代器来完成构造

 

 1.4拷贝构造函数

 就是用另一个vector去直接拷贝构造vector

2.initializer_list初始化vector

initializer_list是C++11提出的东西,其实就是一切都可以{ }中括号初始化

 initializer_list到C++11的先关知识点再细讲,目前记住就是用中括号初始化就行,也可以在中括号前加上等号

3.迭代器 

 vector迭代器与string类似都分为正向迭代器,反向迭代器以及常量迭代器就不细讲了

迭代器组合功能说明迭代器类型
begin()+end()正向起始迭代器+正向结束迭代器iterator
rbegin()+rend()反向起始迭代器+反向结束迭代器reverse_iterator
cbegin()+cend()正向常量起始迭代器+正向常量结束迭代器const_iterator
crbegin()+crend()反向常量起始迭代器+反向常量结束迭代器const_reverse_iterator

与string类类似,vector也可以看做指针

用范围构造vector来举例,用数组的指针也可以完成构造,所以可以看出来vector的迭代器其实是类似指针的

同样也可以用指针偏移量来完成构造

4.常用的几个成员

 4.1  size()统计当前有效字符个数

4.2   capacity    vector容器当前空间大小

 vs编译器扩容机制是1.5倍左右扩容的,当capacity空间不够又要插入数据时就会发生扩容,而capacity就是查看当前空间大小的函数。

 4.3  empty()判空和clear()清空

6.插入和删除 

6.1push_back(尾插)pop_back(尾删)

反正就每次都在最后面插入或者在最后面删除,每次都只能操作一个数据

5.遍历

vector遍历与string基本一样,都有数组那样方括号[ ]访问遍历方式,也有用迭代器访问遍历方式,依旧C++11新标准范围for遍历

普通数组方式遍历

迭代器访问遍历

迭代器使用方法和指针差不多,所以解引用就可以直接访问到了,也可以用auto自动推导类型

范围for遍历

范围for其实底层还是迭代器访问方式,只不过它进行了封装处理

也可以直接用auto推导类型

6.2insert和erase

(1)insert

总结一下,第一个插入是用迭代器控制插入位置,然后插入值,第二个与第一个类似,只是这次是插入n个val。第三个是在指定位置插入另一个容器的内容,用迭代器构成区间来控制插入的内容。

与string迭代器对比,其实都差不多,只不过string把字符与字符串单独拿出来讲了

vector在指定位置insert插入单个数据的例子

值得注意的是insert一般是在指定位置之前插入的,所以找到插入位置之后还得往后挪到一个位置才是正确插入位置。比如1 2 3要在2后面插入数据,此时迭代器要指向3才能正确插入数据

iterator insert (iterator position, const value_type& val);

iterator position是要插入的位置也就是tamp.begin()+2,const value_type& val是具体要插入的数据,也就是555

vector在指定位置insert插入n个同一数据的例子

 void insert (iterator position, size_type n, const value_type& val);

在下面的例子中,iterator position是迭代器位置也就是tamp.begin(),size_type n是插入数量也就是下面例子的5,const value_type& val是具体要插入的数据,也就是下面的字符‘h’

 vector容器范围插入例子

template <class InputIterator>
    void insert (iterator position, InputIterator first, InputIterator last);

iterator position依旧是要插入的位置,也就是下面例子中的tamp.begin()+1,InputIterator first, InputIterator last 是插入另一个容器内容的范围,可以插入全部比如下面例子中的 copytamp.begin(), copytamp.end(),如果指向插入另一个容器的部分内容话那么就得用迭代器加偏移量来实现,比如只插入he,那么就改写成copytamp.begin(),copytamp.begin()+2,因为C++是左闭右开的,所以如果你要处理最右边界的那个数字那么迭代器就得指向它后面

迭代加偏移量例子

(2)erase 

第一个就是删除指定位置的数据,相比与string的erase还得考虑要删除的长度,vector是数组,删除的是数组多个元素中的一个,所以不需要考虑长度。如果要删除多个数据,那么直接用迭代器范围删除就可以了

迭代器控制删除指定位置数据的例子,与insert相比删除是迭代器指向谁就删除谁,而插入是指向谁就插入在谁的前面

迭代器范围删除的例子,依旧是左闭右开规则所以在处理右边界时要多往后面挪动一位

比如下面的例子,本来begin()+2就已经指向k了,但是因为C++规则所以要往后再挪动一位

7.vector的容量操作 

 resize函数

resize是用来调整vector容器中有效字符的个数,其实也就是直接调整size

  1. 如果新大小小于当前大小resize 会将容器的大小减少到指定的新大小,并销毁超出该范围的元素。这意味着它会从向量的末尾开始移除元素,直到向量的大小达到指定的新大小。但是,它不会直接“清空”或“删除”那些被移除的元素;而是调用它们的析构函数(对于基本数据类型如 char,这实际上什么也不做,但对于具有非平凡析构函数的类型则很重要)。end 迭代器会相应地向前移动,以反映新的容器末尾。

  2. 如果新大小大于当前大小resize 会增加容器的大小到指定的新大小,并在新添加的元素位置上执行值初始化(对于基本数据类型如 char,这意味着它们会被初始化为0)。这会增加向量的容量(如果需要的话),并移动 end 迭代器以指向新的容器末尾。打印扩容之后的数据可以看出来原本没有数据的空间全部填充了0

值得注意的是如果是char类型的数组,那么末尾填充的是‘\0’,\0是不能打印出来的,但是依旧会占据空间

不过你也可以在扩容的地方指定多扩的空间用什么值来填充

 reserve函数

 reserve与resize相对,reserve调整的是vector的capacity的大小,也就是实际数组的大小,size是有效数据的大小,这两个有区别。如果空间不过而此时要插入数据是需要扩容的,此时扩容改变的是capacity的大小而不是size的大小

可以插入几十个数据来分别看一个capacity的变化情况,以此来了解扩容机制

从上图的例子可以看出vector以原空间1.5倍的大小来进行扩容

不过不同的编译器的扩容机制都不一样,比如Devc++ 它的底层是gcc,扩容机制就和vs编译器扩容情况不一样。从下图可以看出来devc++的vector是以原空间的两倍来进行扩容的

在vs编译器下,reserve空间大小无论是大于size还是小于size都不会进行缩容,依旧保持原来的reserve的空间大小。如果是原先就reserve比size小的空间,那么最终capacity会等于size

 原先就reserve比size小的空间的情况

上来就直接缩容是不会做改变的

与string的缩容不同,即使在gcc和g++环境下,vector无论咋样只要reserve了一个大的空间然后再reserve是实现不了的,打印出来依旧是之前大的数值,string在vs编译器下不会缩容,而在gcc环境下会缩容(前提是reserve出来的capacity大于size)

8.vector::at与方括号访问方式

at的使用方式与方括号一致[ ]

你也可以用at来访问遍历元素

 

at这个函数实际上返回的是数组中对应元素的引用,所以也可以通过at来进行修改数组中的元素

 

 at与[ ]区别在于虽然都会进行边界检查,但是[ ]是直接assert断言处理越界,at是抛异常,异常信息可以打印出来看看是出来什么问题

可以用try去检查是否抛异常然后用catch进行捕获打印异常(这块到异常的时候再细讲)

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

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

相关文章

青甘环线游记|day(2)|西宁、青海湖

坐动车 早上7:30醒来&#xff0c;在8:00左右起床&#xff0c;下楼吃兰州拉面。面煮的很好吃&#xff0c;就是还是不是很适应。看到8元的牛肉面感觉很震惊&#xff0c;没想到是面8元&#xff0c;牛肉另加&#xff0c;10元。 坐上动车前往西宁&#xff0c;12点左右到了。虽然在…

PXE实现自动安装部署操作系统

PXE&#xff08;Preboot eXecution Environment&#xff09;是一种在计算机启动时使用网络接口从远程服务器获取操作系统安装和启动信息的技术。通过PXE&#xff0c;计算机可以从局域网中的PXE服务器上下载操作系统安装文件&#xff0c;并进行自动化的操作系统部署或故障排除。…

25考研数据结构复习·7.4B树和B+树7.5散列(Hash)表

目录 B树和B树 B树 m阶B树的核心特性 B树的插入 B树的删除 非终端结点关键字 终端结点关键字 低于下限 B树 散列&#xff08;Hash&#xff09;表 基本概念 散列函数的构造 &#x1f469;‍&#x1f4bb; 除留余数法 直接定址法 数字分析法 平方取中法 处理冲突…

动手学深度学习V2每日笔记(池化层)

本文主要参考沐神的视频教程 https://www.bilibili.com/video/BV1EV411j7nX/spm_id_from333.999.0.0&vd_sourcec7bfc6ce0ea0cbe43aa288ba2713e56d 文档教程 https://zh-v2.d2l.ai/ 本文的主要内容对沐神提供的代码中个人不太理解的内容进行笔记记录&#xff0c;内容不会特别…

Linux基础环境开发工具(二)

目录 一、前言二、make和makefile工具1.快速认识一下2.依赖关系和依赖方法3.执行原理 三、Git工具1.快速认识一下2.git的使用 四、gdb工具1.快速认识一下2、类比Windows使用 一、前言 在开发工具第一篇中我们介绍了yum&#xff0c;vim&#xff0c;gcc/g编译器这几种工具&#…

C++ 继承 派生类的拷贝构造

继承 派生类的拷贝构造构造顺序拷贝构造 引例1: 当子类,不自实现拷贝构造时,默认调用父类的拷贝构造引例2: 子类自实现拷贝构造,不做特殊处理时,只会调用父类的构造器.引例3: 显示的调用父类的拷贝构造器。案例: 内嵌函数的拷贝构造 引例1 :当内嵌子对象,子类不自实现拷贝构造时…

Netty二

Netty 问题分析 bootstrap serverBootstrap pipeline和channelPipeline EventLoopGroup和实现类NioEventLoopGroup

U2net论文复现-简单解读-以及奇奇怪怪的改进-测试roc以及pr

论文地址&#xff1a;U2net论文地址 显著性目标检测&#xff1a; Salient ObjectDetetion(SOD)显著性目标检测&#xff0c;就是要把图片中最显著的物体分割出来&#xff0c;所以是二分类任务&#xff0c;只需要背景和前景。 1、Introduce 1.1、目前存在的2个挑战&#xff1…

Day-11 员工管理案例 增删改查、配置文件

SpringBootWeb案例 前面我们已经实现了员工信息的条件分页查询以及删除操作。 关于员工管理的功能&#xff0c;还有两个需要实现&#xff1a; 新增员工修改员工 首先我们先完成"新增员工"的功能开发&#xff0c;再完成"修改员工"的功能开发。而在"新…

Midjourney、Sora和硅谷机密-《分析模式》漫谈15

DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 “Analysis Patterns”的Preface&#xff08;前言&#xff09;有这么一句&#xff1a; Kent Beck, Ward Cunningham, and Jim Coplein encouraged me to get involved with the commu…

《Advanced RAG》-02-揭开 PDF 解析的神秘面纱

摘要 PDF 文件是非结构化文档的代表&#xff0c;但从 PDF 文档中提取信息是一个具有挑战性的过程。 PDF 文件由一系列指令组成&#xff0c;这些指令指示 PDF 阅读器或打印机在屏幕或纸张上显示符号的位置和方式。与 HTML 和 docx 等文件格式不同&#xff0c;后者使用标记来组织…

8月2日,贪心-买卖股票的最佳时期

大家好呀&#xff0c;今天我们看两道用贪心算法解的两道题&#xff0c;150道经典面试题中的买卖股票的最佳时期1和2。 1.买卖股票的最佳时期1 . - 力扣&#xff08;LeetCode&#xff09; 思路 对于这题&#xff0c;我们其实很容易想出暴力解&#xff0c;那就是从后往前找值&…

【文件系统】抽象磁盘的存储结构 CHS寻址法 | sector数组 | LAB数组

目录 1.为什么要抽象 2.逻辑抽象_版本1 2.1sector数组 ​2.2index转化CHS 3.逻辑抽象_版本2 3.1LBA数组 3.2LAB下标转化sector下标 文件其实就是在磁盘中占有几个扇区的问题❗文件是很多个sector的数组下标❗文件是有很多块构成的❗❗文件由很多扇区构成------>文件…

C语言刷题小记3

题目1 序列中删除指定数字 分析&#xff1a;本题要求我们来删除一个序列中指定的数字&#xff0c;这里大家要注意我们要删除的数字可能不止出现一次&#xff0c;所以我们需要用两个变量来进行处理&#xff0c;一个变量来遍历数组&#xff0c;一个变量来存储数组的位置&#xff…

H5 上使用腾讯位置服务选择收货信息

效果图 首先需要在腾讯位置服务上申请你自己的key&#xff0c;可参考地图选点组件 // 点击打开地图 backurl 是点击选中的位置点后&#xff0c;页面跳转至要返回的地址&#xff08;backurl&#xff09;&#xff0c;会将位置信息添加到回跳地址&#xff08;backurl&#xff0…

【威胁情报】新的 BingoMod Android 安卓恶意软件伪装成安全应用程序,清除数据

关注公众号网络研究观获取更多内容。 小心 BingoMod&#xff01;这种危险的 Android 恶意软件会窃取您的钱财、清除您的手机数据并控制您的设备。 了解如何保护自己免受这种阴险威胁。保持在线安全&#xff01; 计算机安全解决方案提供商 Cleafy 发现了一种狡猾的远程访问木…

PCIe总线-RK3588 PCIe RC初始化流程分析(十二)

1.简介 RK3588 PCIe RC的初始化涉及PCIe设备枚举、中断&#xff08;INTx、MSI、MSI-X&#xff09;配置、BAR配置、ATU配置、链路训练等&#xff0c;下面一一介绍。 2.初始化 当RC的模式为RK_PCIE_EP_TYPE时&#xff0c;平台驱动调用rk_add_pcie_port函数初始化RC&#xff0c…

如何将Maven子项目插入到Maven父项目中

Maven项目的融合具体方法&#xff1a; 1.在电脑本地磁盘拷贝Maven子项目&#xff1b; 2.用IDEA软件打开Maven父项目&#xff1b; 3.在IDEA中选中Maven父项目&#xff1b; 4.将复制好的的Maven子项目粘贴到Maven父项目中&#xff1b; 5.选中子项目的pom文件&#xff0c;右键选择…

apk反编译修改教程系列-----修改apk 解除软件限制功能 实例操作步骤解析_5【二十四】

解除apk功能 限制主要是一些app只有付费或者开通vip才可以使用所有功能。这些对于热爱反编译的你是不是比较愤慨,今天继续以一款app为大家来演示如何去除软件的限制功能。教程的目的主要是学习反编译的基础修改方法,了解app的修改步骤以及基础的入门修改常识。 反编译工具:…

无人机无人车固态锂电池技术详解

随着无人机和无人车技术的飞速发展&#xff0c;对高性能、高安全性电池的需求日益迫切。固态锂电池作为下一代电池技术的代表&#xff0c;正逐步从实验室走向市场&#xff0c;为无人机和无人车等应用领域带来革命性的变化。相比传统液态锂电池&#xff0c;固态锂电池在能量密度…