news 2026/2/8 3:49:38

C++STL: vector 简单使用,讲解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C++STL: vector 简单使用,讲解

.vector的构造函数

(1) 构造函数的参数是内存池,我们日常不需要理会,除非你要用自己的内存池,这就是默认构造,explicit修饰,说明该函数不支持隐式类型转换。

(2)用 n 个 val 构造对象

(3)用迭代器区间构造对象,不一定是自己的迭代器,可以类型转换的也行

(4)拷贝构造

代码语言:javascript

AI代码解释

//插入10个数据,都是1 vector<int> v1(10, 1); //默认构造 vector<int> v2; //拷贝构造 vector<int> v3(v1); //迭代器区间构造 vector<int> v4(v1.begin(), v1.end()); //也可以用别的容器的迭代器,前提是支持类型转换的 string s1("xxxxxxxxxxx"); //string迭代器内容是char的,其ASCII码值是int,所以可以类型转换 //并且,char转int不用考虑数据溢出风险,小转大不会溢出。 vector<int> v5(s1.begin(), s1.end());

注意最后一个注释

这里再讲解一个 C++11 添加的非常实用的构造:

花括号 { } 是 initializer_list 类型,C++11定义的新参数 ,其实string也有,不过没用处,十分麻烦,所以没之前介绍

代码语言:javascript

AI代码解释

//vector<int> v6({ 1,2,3,4,5,6,7,8,9,10 }); vector<int> v7 = { 1,2,3,4,5,6,7,8,9,10 };

如图,编译器优化为直接构造(原本是隐式类型转换构造了一个vector对象),严格来说是上面那样,拷贝构造的写法,不过都可以。

有了initializer_list,可以让它像数组一样初始化。

它的底层原理就是两个指针 :把括号内的数据存在临时数组,然后提供了指向首位置和尾下一个位置的指针(迭代器)

所以它是可以使用 范围for 的:

2.迭代器以及各种简单接口:

2.1迭代器

vector的迭代器是和string一样的,用法就是那样

2.2capacity简单接口

是不是十分熟悉?是的,大部分在 string 中都有,使用方式也一样,都是成员函数,利用vector对象就能随手调用

2.3operator=

operator= 十分好用,所以单独拿出来讲,不过它的使用也十分简单,(2)涉及更难的知识,目前不需要知道。

只需要记住:赋值是针对于 已存在对象的操作 (3)的initializer_list 类型也是针对已存在对象,不要与构造函数混淆

代码语言:javascript

AI代码解释

vector<int> v1={1,2,3,4,5} vector<int> v2; //v2先存在,才能谈赋值。 v2 = v1; //一样,这才是赋值,不要与第一行的构造混淆 v2={1,0,0,8,6};
2.4 数据获取接口 at,operator[ ]

这部分和string也是一样。甚至用法也一样。 也只需要知道前两个。 再次提醒:

at和[ ] 都会检测是否越界,不过:at 抛异常,不中止程序,[ ] 是严格的 断言检查,直接中止程序。 (在Debug下)

3.vector的增删查改

主要了解这部分的使用

3.1push_back

尾插没什么区别,参数都是 一个值 val

3.2pop_back

这个没参数,直接调用函数实现 尾删

3.3insert

这里的insert参数都是用迭代器iterator 实现的,第一个最常用,我们了解第一个就行

代码语言:javascript

AI代码解释

//头插 ,头删, 指定位置插入或者删除 v1.insert(v1.begin(), 0); v1.insert(v1.begin()+3, 1);

迭代器参数可以是表达式形式

3.4erase

(1)删除pos迭代器位置 (2)删除一段迭代器区间

最常用的是(1):删除pos迭代器位置

代码语言:javascript

AI代码解释

v1.erase(v1.begin()); v1.erase(v1.begin()+3);

迭代器可以是表达式形式

3.5clear

清理数据,不清空间,和string一样


4.initializer_list { } 与 隐式类型转换,迭代器访问

我们构造一个struct AA:

代码语言:javascript

AI代码解释

//也是类 ,但默认为public struct AA { int _a1 = 1; int _a2 = 1; AA(int a1, int a2) :_a1(a1) ,_a2(a2) {} };

这是一个类,struct也是类,不过成员默认为public 我们可以这样:

代码语言:javascript

AI代码解释

AA aa1 = { 0,0 }; AA aa2({ 0,0 });

这就是多参数的隐式类型转换,构造了AA对象 ,两种写法都行

那如果我们定义了一个存储AA的vector(vector<AA>)就可以这样:

代码语言:javascript

AI代码解释

//隐式类型转换 vector<AA> v1 = { {1,1},{2,2},{3,3} }; //也可以一部分是AA对象 vector<AA> v1 = { aa1,{1,1},{2,2},{3,3} };

这就是两者的结合,可以避免繁琐地一个个创建AA对象,直接用隐式类型转换,vector构造更方便

4.1迭代器访问

当利用迭代器遍历 vector<AA> 时,若AA并没有支持流插入 cout,所以无法完成遍历:

此时有两种办法:1. 重载 << 运算符,让AA支持 cout 输出

2. 让迭代器用 -> 访问AA对象的成员(public):

为什么迭代器it可以访问类的成员?

已知vector的迭代器是指针的封装。vector底层是个数组,存储AA对象,迭代器指向数组内容,也就是指向AA对象,那这个指针就是 AA* 指针,AA* 指针就可以访问AA内部的公有成员。


5.emplace_back 和 push_back 的差异

emplace_back 和 push_back 作用基本相同 但也有差异。我们衔接 4. 的内容来理解:

代码语言:javascript

AI代码解释

//push_back 和 emplace_back 用法差不多 v1.push_back(aa1); v1.emplace_back(aa1);

它们都可以插入一个值 , 但是emplace_back :

代码语言:javascript

AI代码解释

//可以直接传构造AA的参数,因为他是可变参数模板(现阶段没学) //更高效,会直接构造AA v1.emplace_back(1, 1);

push_back:

代码语言:javascript

AI代码解释

//只能传AA对象,不能穿构造AA的参数,这就是区别 //{1,1} 也是AA对象,因为隐式类型转换,构造临时对象AA v1.push_back({ 1,1 });

这就是区别 ,有时候emplace_back 更高效。注意,这两个写法不能交叉用,都是各自专属

www.dongchedi.com/article/7586104283570340414
www.dongchedi.com/article/7586107772832940568
www.dongchedi.com/article/7586105171260801598
www.dongchedi.com/article/7586103844216504856
www.dongchedi.com/article/7586105032132051480
www.dongchedi.com/article/7586105437142417944
www.dongchedi.com/article/7586104244311769625
www.dongchedi.com/article/7586103373234356761
www.dongchedi.com/article/7586103016810971672
www.dongchedi.com/article/7586105462731440664
www.dongchedi.com/article/7586103797324218942
www.dongchedi.com/article/7586103300483973694
www.dongchedi.com/article/7586102611422511678
www.dongchedi.com/article/7586102949072437822
www.dongchedi.com/article/7586108028160836121
www.dongchedi.com/article/7586372917312012824
www.dongchedi.com/article/7586373081946800702
www.dongchedi.com/article/7586373137030677017
www.dongchedi.com/article/7586374371732685374
www.dongchedi.com/article/7586376512555958809
www.dongchedi.com/article/7586375382136816190
www.dongchedi.com/article/7586376917411463704
www.dongchedi.com/article/7586378437947015742
www.dongchedi.com/article/7586377210039501374
www.dongchedi.com/article/7586378517827912217
www.dongchedi.com/article/7586372861272031806

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/2/7 13:00:33

Excalidraw与Slack集成,消息通知及时送达

Excalidraw与Slack集成&#xff0c;消息通知及时送达 在远程协作日益成为常态的今天&#xff0c;团队沟通中的“信息断层”问题愈发突出。一个典型场景是&#xff1a;架构师花了半小时更新了系统设计图&#xff0c;却忘记通知同事&#xff1b;等到评审会议开始时&#xff0c;大…

作者头像 李华
网站建设 2026/2/7 23:24:23

37、PowerShell语言与环境及正则表达式全解析

PowerShell语言与环境及正则表达式全解析 1. PowerShell脚本结构与函数调用 在PowerShell脚本里,命令仅能访问已定义的函数。这常常让大型脚本难以理解,尤其是当脚本开头全是辅助函数时。为让脚本更清晰,可采用如下结构: function Main {(...)HelperFunction(...) } fu…

作者头像 李华
网站建设 2026/2/8 18:11:27

21、Windows 组策略全面解析

Windows 组策略全面解析 1. WQL 语句与 WMI 过滤器 1.1 WQL 语句形式 WQL 语句采用 Select 语句的形式,用于请求特定 WMI 类的所有实例,并为感兴趣的特定属性提供限定符。例如: Select * from Win32_OperatingSystem where Caption="Windows XP Professional"…

作者头像 李华
网站建设 2026/2/8 15:04:31

26、基于Active Directory实现只读域控制器(RODC)的安全部署与管理

基于Active Directory实现只读域控制器(RODC)的安全部署与管理 1. 引言 在分支机构部署域控制器(DC)时,传统的可写DC存在物理安全难以保障、网络带宽不佳导致登录时间长和资源访问效率低等问题。而只读域控制器(RODC)的出现为解决这些问题提供了有效的方案。 2. RODC…

作者头像 李华
网站建设 2026/2/5 11:49:35

27、活动目录安全设计与轻量级目录服务详解

活动目录安全设计与轻量级目录服务详解 1. 利用活动目录快照恢复对象 1.1 连接快照 LDAP 端口 使用 Ldp.exe 连接到之前将快照作为 LDAP 服务器公开时指定的快照 LDAP 端口。 1.2 浏览快照 像浏览任何实时域控制器(DC)一样浏览快照。若要停止 Dsamain,在命令提示符窗口…

作者头像 李华
网站建设 2026/2/6 9:43:50

32、服务器安全与补丁管理全攻略

服务器安全与补丁管理全攻略 在当今数字化的时代,服务器安全和软件补丁管理对于企业的稳定运行和数据安全至关重要。本文将详细介绍服务器角色安全保障、多角色服务器的相关问题,以及补丁管理的四个关键阶段。 服务器角色安全保障 在保障服务器角色安全时,我们需要先深入…

作者头像 李华