C++ Vector深度解析:动态组的底层机制与实战指南
前引:在C++标准模板库(STL)中,vector
被誉为“动态数组”的代名词,其灵活性与高效性使其成为处理序列数据的利器。无论是初学者还是资深开发者,掌握vector
的底层原理与进阶用法,都是提升C++编程能力的关键一步。本文将从技术视角深入剖析vector
的核心机制:
连续存储的威力:探讨vector
基于连续内存的随机访问优势,对比链表等容器的性能差异
迭代器与算法生态:结合STL算法(如sort
、reverse
),展示vector
如何无缝集成到泛型编
目录
Vector介绍
Vector的优势
Vector的使用
实例化
尾插元素
尾删元素
访问元素
(1)下标[ ]形式
(2) 迭代器访问
(3)范围for
编辑
获取元素个数
排序(顺序)
排序(逆序)
调整容量
调整容量+初始化
查找指定内容
指定位置前插入
删除指定位置
去重
Vector介绍
根据小编自己的理解,Vector是C++标准模板库(STL)提供的一个动态数组容器,类似一个模板,可以存储任何类型的数据,包括自定义类型,综上:Vector很像一个动态数组模板
Vector的优势
(1)动态扩容:Vector通过自动管理内存实现容量扩展,支持灵活调整
(2)连续储存:元素在内存中连续储存,支持访问迭代器,访问时间复杂度为O(1)
(3)模板化设计:可存储任意类型元素,语法为:vector<类型>
Vector的使用
实例化
我们可以使用 vector<类型> 变量名,后面可以选择无参、有参初始化,例如:
//实例化
vector<int> S1;
vector<char> S2;
vector<char> S3(5);
vector<string> S4(10, "***");
vector<string>S2(S1.begin(), S1.end());
(1)第一个为int类型和第二个为char类型属于无参实例化
(2)第三个类型为char,开辟了5个元素空间
(3)第四个类型为string,10个string对象都指定初始化为了“***”
(4)第五种属于用迭代器去初始化
尾插元素
尾插和我们之前学习的string很像,包括自动扩容,自动更改数据个数,只是调用对象不同,例如
S1.push_back(1);
对于string类型的动态数组vector也是一样的,例如:
尾删元素
尾删也会自己自己改变数据信息,例如:
S1.pop_back();
对于string类型数据类型的vector也是一样,当初数组来操作:
访问元素
(1)下标[ ]形式
这种情况跟数组访问一样,通过下标去访问,例如:
//下标括号访问
for (int i = 0; i < S1.size(); i++)
{cout << S1[i] << " ";
}
(2) 迭代器访问
//迭代器访问
vector<string>::iterator it = S1.begin();
while (it != S1.end())
{cout << *it << " ";it++;
}
(3)范围for
//范围for
for (auto S : S1)
{cout << S << " ";
}
获取元素个数
这里跟string的形式差不多,只是调用对象不同,例如:
S1.size();
排序(顺序)
将元素按照从小到大的顺序去排序获取结果,这个排序接口不属于vector里面的,属于公有的接口
属于一种算法,需要添加头文件:<algorithm>,同时排序会改变元素本来的位置
//排序
sort(S1.begin(), S1.end());
for (auto e : S1)
{cout << e << " ";
}
排序(逆序)
这里有两种方法,同样都是使用迭代器,但是参数不同
第一种:只修改迭代器
sort(S1.rbegin(), S1.rend());
第二种:添加参数
sort(S1.begin(), S1.end(), greater<string>());
可以使用匿名参数:
也可以用非匿名参数:
调整容量
reserve 虽然会调整容量,但是不会更改size元素个数
S1.reserve(10);
调整容量+初始化
resize 可以改变元素个数,同时也会扩容
S1.resize(10,"**");
查找指定内容
这里的 find 不属于vector,而是算法模拟实现
vector<string>::iterator it = find(S1.begin(), S1.end(), "**");
while (it != S1.end())
{if (*it == "**"){cout << *it;}++it;
}
指定位置前插入
insert 在position之前插入val
S1.insert(S1.begin(),"100");
删除指定位置
erase 删除position位置的数据
S1.erase(S1.end() - 1);
去重
unqiue :返回一个迭代器,指向去重后序列的末尾(即最后一个不重复元素的下一个位置)
auto new_end = erase(begin() , end());
例如:
【雾非雾期待与你的下次相遇!】