前言
vector是一个常用的C++标准库类。 它可以和数组一样,在常数时间内实现随机访问。 不仅如此,vector类中封装的一些方法(如尾部快速插入,判空),使得它更加实用、强大。
索引
vector ? ? 一、初始化 ? ? 二、(尾部)插入 弹出 ? ? 三、随机访问 ? ? 四、容器大小 ? ? ? ? 1. 大小设置 ? ? ? ? 2. 大小查询 ? ? 五、容器遍历 ? ? ? ? 1.使用迭代器遍历容器 ? ? ? ? 2.使用下标遍历容器 ? ? 六、其他(不常用) ? ? ? ? 1. 赋值 ? ? ? ? 2. (指定位置)插入 删除 ? ? ? ? 3. 容器清空
vector
vector定义在vector 头文件中。 实用之前需要手动包含头文件.
#include<vector>
一、初始化
语法
- vector vec :初始化一个存放
type 类型数据的vector空对象vec - vector vec1(vec2):使用vector对象
vec2 初始化对象vec1 - vector vec(beg,end):使用
[beg,end) 地址区间内的元素初始化对象vec 。beg 和end 可以是指针,或者迭代器。 - vector vec(size):初始化一个元素个数为
size 的对象vec 。 - vector vec(size,t):初始化一个元素个数为·size·,元素值为
t 的对象vec 。
代码示例
#include<vector>
vector<int> v1;
vector<int> v2(v1);
vector<int> v3(v1.begin(),v1.end());
vector<int> v4(5);
vector<int> v5(5,1);
二、(尾部)插入 弹出
语法
- vector.push_back(t):在容器的尾部插入元素
t 。 - vector.pop_back():弹出(即删除)容器尾部元素。
代码示例
#include<vector>
using namespace std;
int main(){
vector<int> v1;
v1.push_back(12);
v1.pop_back();
return 0;
}
三、随机访问
语法
- v[idx]:使用
[] 运算符进行随机访问(类似于对数组元素进行访问) - v.at(idx):使用at方法进行随机访问,放回指定元素的引用。
这两个方法都可以对vector对象进行随机访问。 - v.front():返回对象v的首个元素的常引用。
- v.back():返回对象v的最后一个元素的常引用。
ps:[] 运算符和at方法都可以实现随机访问,不同的是at方法在访问时会进行访问检查,当访问超出容器范围时,会抛出out_of_range 异常。
代码示例
#include<vector>
#include<iostream>
using namespace std;
int main(){
vector<int> a;
a.push_back(10);
a.push_back(11);
a.push_back(12);
a.push_back(13);
cout << a[0] << endl;
a[0] ++;
cout << a[0] << endl;
cout << "========" << endl;
cout << a.at(1) << endl;
a.at(1) = 0;
cout << a.at(1) << endl;
cout << "========" << endl;
cout << a.front() << endl;
cout << "========" << endl;
cout << a.back() << endl;
return 0;
}
输出
10
11
========
11
0
========
11
========
13
四、容器大小
1. 大小设置
- v.resize(h,[val]):设置vector的长度为
h 。 - 如果h 小于原本vector容器长度,那么从第h个元素开始往后的元素都将被销毁。 - 如果h 大于原本的vector容器长度,那么会从原本vector容器后面补全h 个元素(如果指定了值val ,那么会用val 初始化新增加的值)。 - 如果h 同时大于capacity,那么会自动完成内存分配。 - reserve(h) 改变当前vecotr所分配空间的大小。
- 如果
h 的值大于当前capacity的大小,则会将容器内存分配至h 。 - 如果
h 的值不大于当前capacity的大小,则不做出操作。
2. 大小查询
- v.size():返回对象
v 当前元素个数 - max_size():返回容器最大可能的分配到的空间大小
- capacity():返回容器当前已分配到的空间大小(如果元素过多,将会自动为容器分配更多的空间)
- empty():返回一个布尔值,表示容器是否为空。
ps:其实这三个关于容器的函数很好理解: 就好比如有一个书架。
size 方法反应书架上有多少的书。capacity 方法反应书架有多大。max_size 方法反应我们可以建造多大的书架。
代码示例
#include<vector>
#include<iostream>
using namespace std;
int main(){
vector<int> v;
v.resize(11);
v.reserve(1123);
cout << "size:" << v.size() << endl;
cout << "capacity:" << v.capacity() << endl;
cout << "max_size:" << v.max_size() << endl;
return 0;
}
输出
size:11
capacity:1123
max_size:536870911
五、容器遍历
vector容器遍历一般有两种办法
1.使用迭代器遍历容器
#include<vector>
#include<iostream>
using namespace std;
int main(){
vector<int> v;
v.push_back(1);
v.push_back(2);
v.push_back(3);
v.push_back(4);
for(vector<int>::iterator p = v.begin();p != v.end();p++)
cout << *p << " ";
cout << endl;
for(vector<int>::reverse_iterator p = v.rbegin();p != v.rend();p++)
cout << *p << " ";
cout << endl;
return 0;
}
输出
1 2 3 4
4 3 2 1
ps:可以将vector<int>::iterator 简写为auto ,即让编译器自动识别变量类型。
2.使用下标遍历容器
#include<vector>
#include<iostream>
using namespace std;
int main(){
vector<int> v;
v.push_back(1);
v.push_back(2);
v.push_back(3);
v.push_back(4);
for(int i = 0;i < (signed)v.size();i++)
cout << v[i] << " ";
cout << endl;
for(int i = v.size() - 1;i >= 0;i--)
cout << v[i] << " ";
cout << endl;
return 0;
}
输出
1 2 3 4
4 3 2 1
使用下标进行遍历,这种方式和对数组进行遍历一样,所以更容易让人接受。 但使用下标遍历,可能会有潜在的效率问题。欢迎阅读我的另外一篇文章,进行深入了解→
六、其他(不常用)
1. 赋值
语法
- v.aasign(beg,end):将
[beg,end) 地址区间的值赋给vector对象v 。 - v.assign(n,val):将
n 个值val 赋值给对象v 调用该方法后,对象v 原本的数据都会被销毁。 当且仅当赋值后所需的内存大于容器原有内存时,系统会自动为容器重新分配内存。
代码示例
#include<iostream>
#include<vector>
using namespace std;
int main(){
vector<int> a,b;
a.push_back(5);
a.push_back(3);
cout << "赋值前:";
for(auto p = a.begin();p != a.end();p++)
cout << *p << " ";
cout << endl;
a.assign(5,1);
cout << "赋值后:";
for(auto p = a.begin();p != a.end();p++)
cout << *p << " ";
cout << endl;
b.push_back(10);
b.push_back(12);
b.push_back(48);
cout << "使用b赋值后:";
a.assign(b.begin(),b.end());
for(auto p = a.begin();p != a.end();p++)
cout << *p << " ";
cout << endl;
return 0;
}
输出
赋值前:5 3
赋值后:1 1 1 1 1
使用b赋值后:10 12 48
2. (指定位置)插入 删除
- v.insert(ite,val):将值
val 插入到对象v 的迭代器ite 所对应的位置。 - v.insert(ite,n,val):将
n 个值val 插入到迭代器ite 所对应的位置。 - vl.insert(ite,beg,end):将区间
[beg,end) 中的值插入到迭代器ite 的位置。 - v.erase(ite):删除对象
v 中迭代器ite 所对应位置的值。 - v.erase(beg,end):删除对象
v 中区间[beg,end) 位置的值。
由于insert 和erase 的操作与迭代器关系较为紧密,且通常与find 等其他函数结合才能发挥出其实际作用,因此在此不做深入探究。
如果您想要对vector的insert 和erase 方法深入了解,欢迎关注我后续的文章→
3. 容器清空
- v.clear():清空对象。
ps:调用clear方法后,对象的size() 变为0——即清空了元素,元素个数为0。 但capacity() 不变——即不会重新进行内存分配。
参考资料
vector官方文档
原创不易,感谢您的支持。
|