vector是表示可变大小数组的序列容器。本质上,vector使用动态分配数组来存储它的元素。
1.头文件
#include<vector>
2.vector声明及初始化
vector<int> vec; //声明一个int型向量
vector<int> vec(5); //声明一个初始大小为5的int向量
vector<int> vec(10, 1); //声明一个初始大小为10且值都是1的向量
vector<int> vec(tmp); //声明并用tmp向量初始化vec向量
vector<int> tmp(vec.begin(), vec.begin() + 3); //用向量vec的第0个到第2个值初始化tmp
int arr[5] = {1, 2, 3, 4, 5};
vector<int> vec(arr, arr + 5); //将arr数组的元素用于初始化vec向量
//说明:当然不包括arr[4]元素,末尾指针都是指结束元素的下一个元素,
//这个主要是为了和vec.end()指针统一。
vector<int> vec(&arr[1], &arr[4]); //将arr[1]~arr[4]范围内的元素作为vec的初始值
vector<pair<int ,char>> p;
vector<pair<char,int>> p(mp.begin(),mp.end());//mp是map<char,int> 类型;
3.vector基本操作
向量大小: vec.size();
向量判空: vec.empty();
末尾添加元素: vec.push_back();
末尾删除元素: vec.pop_back();
插入元素: v.insert(p,val);//在迭代器p前面插入新元素val
注意:vector没有push_front,list和deque则有
在迭代器p指向元素之前插入一个值为t的元素: vec.insert(p,t);
删除迭代器p指定元素: vec.erase(p);
交换两个向量的元素: vec.swap();
访问第一个元素: vec.front();
访问最后一个元素: vec.back();
pair添加元素:p.push_back(make_pair(10,'a'));
拷贝:
vector<int> v1(v2); //法1:初始化构造时拷贝,注意不能是vector<int> v1=v2
v1.assign(v2.begin(), v2.end()); // 法2
4.vector算法
4.1 vector 自定义排序
#include<algorithm>
sort(res.begin(), res.end(),comp);
#include<algorithm>
class Solution {
public:
vector<vector<int> > subsets(vector<int> &S) {
vector<vector<int> > res;
if (S.empty()) return res;
int n;
vector<int> v;
res.push_back(v);
sort(S.begin(), S.end());
for (int i = 0; i<S.size(); i++){
n = res.size();
for (int j = 0; j<n; j++){
v = res[j];
v.push_back(S[i]);
res.push_back(v);
}
}
sort(res.begin(), res.end(),comp);
return res;
}
static bool comp(const vector<int>& a1,const vector<int>& a2)
{
if(a1.size() < a2.size())
return true;
else if(a1.size() == a2.size())
return a1 < a2;
else
return false;
}
};
pair排序
bool judge(const pair<int,char> a, const pair<int ,char> b) {
return a.first<b.first;
}
int main()
{
vector<pair<int ,char>> p;
p.push_back(make_pair(10,'a'));
p.push_back(make_pair(9,'c'));
p.push_back(make_pair(10,'t'));
p.push_back(make_pair(17,'y'));
p.push_back(make_pair(10,'b'));
sort(p.begin(),p.end(),judge);
for(auto i=0;i<p.size();i++)
cout<<p[i].first<<" "<<p[i].second<<endl;
system("pause");
}
4.2 vector翻转
#include<algorithm>
reverse(vec.begin(),vec.end());
4.3 vector的遍历方法
标准法
int count = valList.size();
for (int i = 0; i < count;i++)
{
cout << valList[i] << endl;
}
for区间遍历
for (auto val : valList)
{
cout << val << endl;
}
4.4 vector去重
先用sort()排序,然后利用unique()函数将重复的元素放到vector的尾部,然后返回指向第一个重复元素的迭代器,再用erase函数擦除从这个元素到最后元素的所有的元素
sort(res.begin(),res.end());
res.erase(unique(res.begin(), res.end()), res.end());
参考教程
- 论C++11 中vector的N种遍历方法 - 神气 - 博客园
https://www.cnblogs.com/xylc/p/3653036.html - C++ STL之vector用法总结 - 清水汪汪 - 博客园
https://www.cnblogs.com/zhonghuasong/p/5975979.html