前言
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); // 在尾部插入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,那么会自动完成内存分配。 - v.reserve(h) 改变当前vecotr所分配空间的大小。
- 如果
h的值大于当前capacity的大小,则会将容器内存分配至h。 - 如果
h的值不大于当前capacity的大小,则不做出操作。
- 如果
2. 大小查询
- v.size():返回对象
v当前元素个数 - v.max_size():返回容器最大可能的分配到的空间大小
- v.capacity():返回容器当前已分配到的空间大小(如果元素过多,将会自动为容器分配更多的空间)
- v.empty():返回一个布尔值,表示容器是否为空。
欢迎阅读我的另一篇文章,增加对这几个函数的理解和区分→ vector size max_size capacity区别与理解
代码示例
讯享网#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:
五、容器遍历
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,即让编译器自动识别变量类型。
特别注意:
逆序迭代器vector<int>::reverse_iterator为C++11新特性,在C++98中不存在。
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
使用下标进行遍历,这种方式和对数组进行遍历一样,所以更容易让人接受。
但使用下标遍历,可能会有潜在的效率问题。欢迎阅读我的另外一篇文章,进行深入了解→size复杂度问题
六、其他(不常用)
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所对应的位置。 - v.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官方文档
原创不易,感谢您的支持。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/67119.html