您现在的位置是:首页 >技术交流 >C/C++: vertor的用法-知识点比较密集-干货版网站首页技术交流
C/C++: vertor的用法-知识点比较密集-干货版
前言:
在C++世界中,vector是程序员的"动态瑞士军刀"--他是传统数组的升级版,又可以像链表一样灵活的缩放,却又可以保持着数组的高效随机访问的特性。通过自动内存管理,它让开发者告别了手动分配内存的繁琐和风险。稳居STL使用率榜首的它,通向现代C++高效率编程的钥匙。
如果您也觉得本文不错的话请不要吝啬手中的赞和关注嗷,您现在的关注是博主最早期的精神股东~
1.vector使用格式
容器类型有广泛的选择范围。它既可以是各类基本数据类型,像常见的整数类型 int、双精度浮点类型 double、字符类型 char,字符串 string,也能是自定义的结构体类型; 此外,容器类型 还能代表 STL 标准库中的各种容器类型。
#include<vector>//所需头文件
int main()//定义方式
{
//格式:vector<容器类型> 容器名称;
vector<int> v1;//定义了一个int元素类型 容器名称为v1
}
2.vector赋值方式
定义的vector相当于一维数组,这意味着我们能够采用读取数组元素的方式来读取vector中的元素。
vector<int> vt{1,2,3,4,5}; //花括号赋值
for(auto i : vt) cout << i << " "; //1 2 3 4 5
vector<int> vt(5, 6); //括号赋值
for (auto i : vt) cout << i << " "; //6 6 6 6 6
vector<int> vt(5); //括号赋值
for (auto i : vt) cout << i << " "; //0 0 0 0 0
3.vector二维数组的使用方式
//格式:vector<容器类型> 容器名(数量,容器名); //这个vector中包含了多少个 其他类型
int main()
{
vector<int> v = { 1,2,3};//单个容器
vector< vector<int> > vv(5,v);//二维容器
//为了方便理解,我就不使用语法糖来写
for (int i = 0; i < vv.size(); i++)
{
for (int j = 0; j < vv[i].size(); j++)
{
cout << vv[i][j] << " ";
}cout<< endl;
}
return 0;
}

4.vector迭代器
- 正向迭代器(iterator):用于从容器的起始位置向末尾位置正向遍历元素。
int main() { svector<int> vec = {1, 2, 3, 4, 5}; // 使用正向迭代器遍历 vector for (vector<int>::iterator it = vec.begin(); it != vec.end(); ++it) { cout << *it << " "; // 使用 * 解引用迭代器获取元素的值 }//运行结果:1 2 3 4 5 cout << endl; return 0; } - 常量正向迭代器(const_iterator):与正向迭代器类似,但只能用于读取元素,不能修改元素的值。当你需要遍历一个 const 类型的 vector 或者不希望修改元素时使用。
int main() { const vector<int> vec = { 1, 2, 3, 4, 5 }; // 使用常量正向迭代器遍历 const vector for (vector<int>::const_iterator it = vec.begin(); it != vec.end(); ++it) { cout << *it << " "; // *it = 10; // 错误:不能通过 const_iterator 修改元素的值 } //运行结果:1 2 3 4 5 cout << endl; return 0; } - 反向迭代器(reverse_iterator):用于从容器的末尾位置向起始位置反向遍历元素。
int main() { vector<int> vec = { 1, 2, 3, 4, 5 }; // 使用反向迭代器遍历 vector for (vector<int>::reverse_iterator rit = vec.rbegin(); rit != vec.rend(); ++rit) { cout << *rit << " "; }//运行结果:5 4 3 2 1 cout << endl; return 0; } - 常量反向迭代器(const_reverse_iterator):与反向迭代器类似,但只能用于读取元素,不能修改元素的值。
int main() { const vector<int> vec = { 1, 2, 3, 4, 5 }; // 使用常量反向迭代器遍历 const vector for (vector<int>::const_reverse_iterator crit = vec.rbegin(); crit != vec.rend(); ++crit) { cout << *crit << " "; // *crit = 10; // 错误:不能通过 const_reverse_iterator 修改元素的值 }//运行结果:5 4 3 2 1 cout << endl; return 0; }
===至此,相信大家对 vector 已经有了一定程度的了解。接下来,就让我们开启 vector 常见函数的学习之旅吧!===
5.vector常用函数
1.begin() 和 end()-返回开始位置和结束位置
这两个成员函数用于返回迭代器,帮助我们遍历 vector 中的元素
- begin():返回指向 vector 首个元素的迭代器。若 vector 为空,返回的迭代器与 end() 返回的迭代器相同。
- end():返回指向 vector 末尾元素之后位置的迭代器,这是一个 “超尾” 位置,不指向实际元素。当使用迭代器遍历 vector 时,通常以 end() 作为结束条件。

int main()
{
vector<int> vec = { 1, 2, 3, 4, 5 };
for (auto it = vec.begin(); it != vec.end(); ++it) {
cout << *it << " ";
}
//运行结果:1 2 3 4 5
cout << endl;
}
2.size()-获得元素个数
用法:size() 函数返回 vector 中当前存储的元素数量。它反映了 vector 实际包含的元素个数。
int main() {
vector<int> vec = { 1, 2, 3 };
cout << "元素个数: " << vec.size() << endl;
//运行结果:元素个数: 3
return 0;
}
3.capacity()-当前容量大小
用法:capacity() 函数返回 vector 当前已分配的存储空间能够容纳的元素数量。capacity 通常大于或等于 size,当 size 达到 capacity 时,若再添加元素,vector 会重新分配更大的内存空间。
int main() {
vector<int> vec = { 1, 2, 3 };
cout << "容量为: " << vec.capacity() << endl;
//运行结果:容量为: 3
return 0;
}
4.reserve()-预先分配容量
用法:reserve(n) 函数用于为 vector 预先分配至少能容纳 n 个元素的内存空间。如果 n 大于当前的 capacity,vector 会重新分配内存并将原有元素复制到新的内存空间;如果 n 小于等于当前的 capacity,则不会进行任何操作。
int main() {
vector<int> vec = { 1, 2, 3 };
vec.reserve(100);
cout << "容量为: " << vec.capacity() << endl;
//运行结果:容量为: 100
return 0;
}
5.empty()-判空
用法:empty() 函数用于判断 vector 是否为空。如果 vector 中没有元素,返回 true;否则返回 false。
int main() {
vector<int> vec;
if (vec.empty()) {
cout << "The vector is empty." << endl;
}//运行结果:The vector is empty.
return 0;
}
6.insert()-插入
用法:insert() 函数用于vector 的指定位置插入元素。
常见的调用形式有:
- insert(pos, value):在迭代器 pos 所指向的位置插入一个值为 value 的元素。
- insert(pos,n,value):在迭代器pos所指向的位置插入n个值为value 的元素。
- insert(pos,first,last):在迭代器pos所指向的位置插入迭代器 first 到 last 范围内的所有元素。
int main() {
vector<int> vec = { 1, 2, 3 };
auto it = vec.begin() + 1;
vec.insert(it, 4); // 在第二个位置插入 4
for (int num : vec) {
cout << num << " ";
}
//运行结果:1 4 2 3
cout << endl;
vec.insert(it, 2, 5); // 在第二个位置插入 2 个 5
for (int num : vec) {
cout << num << " ";
}
//运行结果:1 5 5 4 2 3
cout << endl;
vec.insert(it,vec.begin()+3,vec.end()-1); // 在第二个位置插入 [3,4) 范围内的元素
for (int num : vec) {
cout << num << " ";
}
//运行结果:1 5 5 4 2 3 4
return 0;
}
7.push_back()-尾插
用法:push_back(value) 函数用于在 vector 的末尾添加一个新元素,其值为 value。如果 vector 的 size 达到了 capacity,会自动重新分配内存以容纳新元素。
int main() {
vector<int> vec = { 1, 2, 3 };
vec.push_back(4);
for (int num : vec) {
cout << num << " ";
}//运行结果:1 2 3 4
cout << endl;
return 0;
}
8.pop_back()-尾删
用法:pop_back() 函数用于移除 vector 中的最后一个元素。调用该函数后,vector 的 size 会减 1,但 capacity 不会改变。如果 vector 为空,调用此函数会导致未定义行为。
int main() {
vector<int> vec = { 1, 2, 3 };
vec.pop_back();
for (int num : vec) {
cout << num << " ";
}//运行结果:1 2
cout << endl;
return 0;
}
9.erase()-移除指定位置或指定范围的数据
用法:erase() 函数用于移除 vector 中指定位置或指定范围内的元素。
常见的调用形式有:
- erase(pos):移除迭代器 pos 所指向的元素。
- erase(first, last):移除从迭代器 first 到 last 范围内的所有元素(不包含 last 所指向的元素)。
int main() {
vector<int> vec = { 1, 2, 3, 4, 5 ,6,7,8,9,10};
auto it = vec.begin() + 2;
vec.erase(it); // 移除第三个元素
for (int num : vec) {
cout << num << " ";
}//运行结果:1 2 4 5 6 7 8 9 10
vec.erase(vec.begin()+3,vec.end()-2);//移除 [3,7) 范围内的元素
for (int num : vec) {
cout << num << " ";
}//运行结果:1 2 4 8 9
cout << endl;
return 0;
}
10.resize()-改变 vector 的大小
用法:resize(n) 函数用于改变 vector 的大小为 n。
如果 n 大于当前的 size(元素个数),会在 vector 的末尾添加默认构造的元素;如果 n 小于当前的 size,会移除末尾的元素,使 vector 的大小变为 n。resize(n, value) 则在 n 大于当前 size时,用 value 填充新添加的元素。
int main() {
vector<int> vec = { 1, 2, 3 };
vec.resize(5); // 大小变为 5,新元素默认初始化为 0
for (int num : vec) {
cout << num << " ";
}//运行结果:1 2 3 0 0
cout << endl;
vec.resize(2); // 大小变为 2,超出部分被移除
for (int num : vec) {
cout << num << " ";
}//运行结果:1 2
cout << endl;
return 0;
}
本文全面介绍了vector 的使用。涵盖基本定义、二维数组格式,讲解迭代器类型与使用,还阐述 begin、end 等多个常用接口用法。vector 灵活实用,能满足多样数据存储需求,愿大家深入掌握~





QT多线程的5种用法,通过使用线程解决UI主界面的耗时操作代码,防止界面卡死。...
U8W/U8W-Mini使用与常见问题解决
stm32使用HAL库配置串口中断收发数据(保姆级教程)
分享几个国内免费的ChatGPT镜像网址(亲测有效)
Allegro16.6差分等长设置及走线总结