江河入海,知识涌动这是参与江海计划的第12篇。
文章目录
vector从入门到精通
须知
💬 欢迎讨论:如果你在学习过程中有任何问题或想法,欢迎在评论区留言,我们一起交流学习。你的支持是我继续创作的动力!
👍 点赞、收藏与分享:觉得这篇文章对你有帮助吗?别忘了点赞、收藏并分享给更多的小伙伴哦!你们的支持是我不断进步的动力!
🚀 分享给更多人:如果你觉得这篇文章对你有帮助,欢迎分享给更多对C++感兴趣的朋友,让我们一起进步!
前言
vector是STL容器中的一种常用的容器,和数组类似,由于其大小(size)可变,常用于数组大小不可知的情况下来替代数组。
vector是为了实现动态数组而产生的容器,然而向量这个名字是STL编写者取名没区好,因为在数学上的向量在几何中是矢量,两者名字相同而意义大相径庭。
vector也是一种顺序容器,在内存中连续排列,因此可以通过下标快速访问,时间复杂度为O(1)。然而,连续排列也意味着大小固定,数据超过vector的预定值时vector将自动扩容。
1.C++ 容器简介
1.1 C++ STL 容器概述
C++ 提供了丰富的标准模板库 (STL),包括 顺序容器(如 )、关联容器(如 、)等。 是最常用的 STL 顺序容器之一,它的特点是支持 动态数组,可以在运行时自动扩展容量,提供高效的随机访问。
1.2 为什么使用
与传统的 C 语言定义数组()相比, 具有以下优势:
- 动态调整大小,无需手动管理内存;
- 提供了丰富的接口,支持插入、删除、查找等操作;
- 内置内存管理机制,防止越界访问。
vector<double> v = {1.1, 2.2, 3.3, 4.4, 5.5};
1.3 的优缺点
- 优点:(1) 指定一块内存大小的数组的连续存储,即可以像数组一样操作,但可以对此数组进行动态操作。通常体现在push_back() pop_back()
(2) 随机访问方便,即支持[ ]操作符和vector.at( ) (3) 节省空间。
- 缺点:(1) 在内部进行插入删除操作效率低。
(2) 只能在vector的最后进行push和pop,不能在vector的头进行push和pop。 (3) 当动态添加的数据超过vector默认分配的大小时要进行整体的重新分配、拷贝与释放。
2. vector容器基本构造函数
2.1 构造函数

2.1.1 示例代码:
输出结果:
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 2 3 4 5 6
https://cplusplus.com/reference/vector/vector/vector/ (文档链接)
3. vecto容器容量与大小接口(interface)
3.1 相关接口

3.1.1 示例代码:
输出结果:
9 8 7 6 5 4 3 2 1 0
size:10
capacity10
v1为空vector
9 8 7 6 5 4 3 2 1 0 10 10 10 10 10 10 10 10 10 10
9 8 7 6 5 4 3 2 1 0 10 10 10 10 10 10 10 10 10 10
3.2 动态扩展与性能问题
当 超过当前容量时,会自动扩展存储空间,通常是翻倍或1.5倍。虽然扩展是自动的,但涉及到内存重新分配,因此建议提前使用 预留空间,减少不必要的性能开销。
https://cplusplus.com/reference/vector/vector/capacity/ (文档链接)
4. 元素访问与修改
4.1 元素访问与修改接口

4.1.1 示例代码:
输出结果:
First element:1
Last element:5
v1[0]:1
v1[4]:5
1 2 3 4 5
4.1.2 operator[]与at处理异常区别
1——> operator[]发生异常,直接进行断言。
2——> at发生异常时,抛出(throw)异常,可以用try()catch{}捕获异常。
operator[]发生异常如下:
#include<vector>
#include<iostream>
using namespace std;int main()
{
vector<int> v1 = { 1,2,3,4,5 };
cout << "v1[5]:" << v1[5] << endl;

at发生异常如下:
#include <iostream>
#include <vector>
using namespace std;int main() {
vector<int> v = { 1, 2, 3, 4, 5 };
try {
cout << v.at(10); // 越界访问
}
catch (out_of_range& e) {
cout << "Exception: " << e.what() << endl;
}//异常捕获
return 0;
}

https://cplusplus.com/reference/vector/vector/at/ (文档入口)
也可以通过上述操作实现修改,操作如下:
v[0] = 2;
v.at(3)=20;
5. 的迭代器与遍历
5.1 迭代器
跟string类迭代器的使用一致,这里就不再展示了。

反向迭代器:
5.2 for_each()函数
https://cplusplus.com/reference/algorithm/for_each/(文档入口)

5.3 迭代器失效问题(难点)
5.3.1 迭代器失效原因与后果
迭代器失效的根本原因在于底层内存的重新分配或元素的移除,导致迭代器指向的内存不再有效。当发生迭代器失效时,继续使用该迭代器可能会引发未定义行为,如程序崩溃或访问错误数据。
5.3.2 迭代器失效常见行为
一般情况下,vector发生扩容或删除数据,会分配新的内存空间并将原有元素搬移到新的位置,可能就会导致迭代器失效。如push_back(),erase(),insert(),resreve(),resize(),assign()等。
5.3.3 迭代器扩容引起失效
补充:vector底层原理旧空间被释放掉,而在打印时,it还使用的是释放之间的旧空间,在对it迭代器操作时,实际操作的是一块已经被释放的空间,而引起代码运行时崩溃。
5.3.4 删除导致迭代器失效
5.3.5 删除偶数时的正确和错误写法
错误示例代码:
正确解法:
5.3.6 总结与建议
6.vector 插入、删除与修改
6.1 插入

6.1.1 示例代码:
6.2 与 的区别
当调用push_back() 或insert() 成员函数时,是把元素类型的对象传递给它们,这些对象被拷贝到容器中。而当我们调用一个 emplace 系列函数时,则是将相应参数传递给元素类型的构造函数。这样emplace_back() 能就地通过参数构造对象,不需要拷贝操作,相比push_back() 能更好的避免内存的拷贝和移动,提升容器插入元素的性能。大多数情况都应该使用 emplace 系列函数:emplace; emplace_back; emplace_hit; emplace_fornt; emplace_after.
emplace_back() 成员函数的用法也很简单,这里直接举个例子:
6.2.1示例代码:
6.3 删除操作

6.3.1 示例代码:
输出结果:
2 3 4
6.3.2 使用 清空
//输出0
https://cplusplus.com/reference/vector/vector/erase/ (相关链接)
最后

相信通过这篇文章你对C++vector类高级部分的有了初步的了解。如果此篇文章对你学习C++有帮助,期待你的三连,你的支持就是我创作的动力!!!
下一篇文章再会.
到此这篇stlvector的用法(stirct用法)的文章就介绍到这了,更多相关内容请继续浏览下面的相关推荐文章,希望大家都能在编程的领域有一番成就!版权声明:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权、违法违规、事实不符,请将相关资料发送至xkadmin@xkablog.com进行投诉反馈,一经查实,立即处理!
转载请注明出处,原文链接:https://www.xkablog.com/rfx/19161.html