vector就是一个不定长数组,另外它把一些常用操作“封装”在了vector类型内部。例如,若a是一个vector,可以用a.size()读取它的大小,a.resize()改变大小,a.push_back()向尾部添加元素,a.pop_back()删除最后一个元素,clear()清空,empty测试是否为空。
vector是一个模板类,所以需要用vector<int> a或者vector<double> b这样的方式来声明一个vector。vector<int>是一个类似于 int a[]的整数数组,而vector<string>就是一个类似于string a[]的字符串数组,vector可以直接赋值,也可作为函数的参数或返回值,而无需像传递数组那样另外用一个变量指定元素个数。
一. vector用法:
1.头文件:#include<vector>
2. vector声明及初始化
vector<int>::iterator it;//定义一个迭代器 vector<int> vec; //声明一个int型向量 vector<string>v2;// vector元素为string型 vector<node>v3;//入队元素为结构体型,结构体可以自行定义 vector<); //声明一个初始大小为5的int向量 vector<, ); //声明一个初始大小为10且值都是1的向量 vector<int> vec(tmp); //声明并用tmp向量初始化vec向量 vector<); //用向量vec的第0个到第2个值初始化tmp ] = {, , , , }; vector<); //将arr数组的元素用于初始化vec向量 //说明:当然不包括arr[4]元素,末尾指针都是指结束元素的下一个元素, //这个主要是为了和vec.end()指针统一。 vector<], &arr[]); //将arr[1]~arr[4]范围内的元素作为vec的初始值
3. vector基本操作
v1.push_back() //在数组的最后添加一个数据 v1.pop_back() //去掉数组的最后一个数据 v1.front() //返回第一个元素(栈顶元素) v1.begin() //得到数组头的指针,用迭代器接受 v1.end() //得到数组的最后一个单元+1的指针,用迭代器接受 v1.clear() // 移除容器中所有数据 v1.empty() //判断容器是否为空 v1.erase(pos) //删除pos位置的数据 v1.erase(beg,end)// 删除[beg,end)区间的数据 v1.size() //回容器中实际数据的个数 v1.insert(pos,data) //在pos处插入数据
举例:
#include <iostream> #include <algorithm> #include <vector> using namespace std; int main() { vector <int> v; //定义vector vector<int>::iterator it; //定义一个vector迭代器 ; i >= ; i--) //插入数据 v.push_back(i); cout<<"输出:"; for(it=v.begin();it!=v.end();it++) //输出迭代器的值 cout<<*it<<" "; cout<<endl; it-=; cout<<"最后一个的值为:"<<*it<<" "<<endl; v.erase(it); //删除最后一个元素 cout <<"元素个数:" <<v.size() << endl; //输出元素个数 sort(v.begin(), v.end()); //vector排序 cout<<"排序后:"; for(it=v.begin();it!=v.end();it++) //输出vector元素 cout << *it << " "; cout<<endl; v.insert(v.begin(),) ; //在pos位置插入一个elem cout<<"第一个元素为:" <<v.front()<<endl;//输出第一个元素 v.pop_back(); //去掉最后一个元素 cout << "元素个数:" <<v.size() << endl;//输出元素个数 v.clear(); //vector清空 cout <<"清空后元素个数:" << v.size() << endl; //输出元素个数 ; }
https://blog.csdn.net/weixin_35929051/article/details/52661619
(1). 容量
- 向量大小: vec.size();
- 向量最大容量: vec.max_size();
- 更改向量大小: vec.resize();
- 向量真实大小: vec.capacity();
- 向量判空: vec.empty();
- 减少向量大小到满足元素所占存储空间的大小: vec.shrink_to_fit();
(2). 修改
- 多个元素赋值: vec.assign(); //类似于初始化时用数组进行赋值
- 末尾添加元素: vec.push_back();
- 末尾删除元素: vec.pop_back();
- 任意位置插入元素: vec.insert();
- //ve.insert(it,n,e)//在it指向元素的前面添加n个元素e
-
ve.insert(ve.end(),1,2);//相当于在尾部添加1个2
-
ve.insert(ve.begin(),1,0);//在头部添加1个0
- 任意位置删除元素: vec.erase();
- 交换两个向量的元素: vec.swap();
- 清空向量元素: vec.clear();
(3)迭代器
- 开始指针:vec.begin();
- 末尾指针:vec.end(); //指向最后一个元素的下一个位置
- 指向常量的开始指针: vec.cbegin(); //意思就是不能通过这个指针来修改所指的内容,但还是可以通过其他方式修改的,而且指针也是可以移动的。
- 指向常量的末尾指针: vec.cend();
(4)元素的访问
- 下标访问: vec[1]; //并不会检查是否越界
- at方法访问: vec.at(1); //以上两者的区别就是at会检查是否越界,是则抛出out of range异常
- 访问第一个元素: vec.front();
- 访问最后一个元素: vec.back();
- 返回一个指针: int* p = vec.data(); //可行的原因在于vector在内存中就是一个连续存储的数组,所以可以返回一个指针指向这个数组。这是是C++11的特性。
(4)算法
- 遍历元素
vector<int>::iterator it; for (it = vec.begin(); it != vec.end(); it++) cout << *it << endl; //或者 for (size_t i = 0; i < vec.size(); i++) { cout << vec.at(i) << endl; }
- 元素翻转
#include <algorithm> reverse(vec.begin(), vec.end());
- 元素排序
#include <algorithm> sort(vec.begin(), vec.end()); //采用的是从小到大的排序 //如果想从大到小排序,可以采用上面反转函数,也可以采用下面方法: bool Comp(const int& a, const int& b) { return a > b; } sort(vec.begin(), vec.end(), Comp);
二.重要应用--vector二维使用
例如 :
vector<]; //第一维的大小是固定的,不超过maxn---30,但第二维的大小是不固定的 int t,n; cin>>n; ;i<n;i++) //插入值 { cin>>t; a[i].push_back(t); }
//c++vector二维数组常用写法 vector<vector<);//定义行数为3列数不定的二维数组 a.size();//返回二维数组的行数 a[].size();//返回二维数组第一行的列数
vector<string>v2;// vector元素为string型