使用vector,需添加头文件#include,要使用sort或find,则需要添加头文件#include。函数封装在命名空间std中,使用:using namespace std;
1、vector的初始化
std::vector<int> nVec; // 空对象
std::vector<int> nVec(5,-1); // 创建了一个包含5个元素且值为-1的vector
std::vector<std::string> strVec{"a", "b", "c"}; // 列表初始化
std::vector<int> nVec; nVec.push_back(i); // 压入元素
要注意“()”和“{}”这样的初始化情况,如:
std::vector<int> nVec(10,1); // 包含10个元素,且值为1
std::vector<int> nVec{10,1}; // 包含2个元素,值分别为10,1
2、vector访问
方法1,数组下标访问
for(size_t i = 0; i < nVec.size(); ++i)std::cout << nVec[i] << std::endl; // 输出元素
方法2,迭代器访问
std::vector<int>::iterator itr = nVec.begin();
for(; itr != nVec.end(); ++itr)std::cout << (*itr) << std::endl;
方法3,使用auto
for(auto &it: nVec)std::cout << it << std::endl;
3、vector删除元素
针对于非array容器有多种删除方式,以erase为例,比如:
c.erase(p); // 删除迭代器p所指定的元素,返回一个指向被删除元素之后的迭代器。
c.erase(begin,end); // 删除b,e所指定范围内的元素,返回一个指向被删除元素之后的迭代器。
c.clear(); // 删除所有元素
注意,删除元素,会导致迭代器无效。正确的删除元素示例:
std::vector<int>::iterator iter = nVec.begin();
for(auto it = nVec.begin(); iter != nVec.end();)
{if(*it == delVal){it = nVec.erase(iter);continue;}it++;
}
删除容器内某一个特定的元素,编写方式可为:
std::vector<int>::iterator iter = std::find(nVec.begin(),nVec.end(),5);
if(iter != nVec.end())nVec.erase(iter);
删除容器内所有元素,当然可以这样:
nVec.erase(nVec.begin(),nVec.end());
nVec.clear();
4、vector的容量与大小
vector并非随着每个元素的插入而增长自己,它总是分配一些额外的内存容量,这种策略使得vector的效率更高些。若要获取当前vector的大小,可调用size()函数,而获取当前vector的容量,可调用capcity()。
5、vector排序
sort函数包含在头文件为#include的c++标准库中, #include。
sort函数的三个参数:
a)待排序的数组的起始地址;
b)待排序数组的结束地址;
c)排序的方法,可以从大到小,也可以从小到大,还可以不写,默认为从小到大。
5.1、默认排序
int cNum[10] = {0,4,6,8,9,2,3,5,6,7};
sort(cNum, cNum+10);vector<int> vecNum{0,4,6,8,9,2,3,5,6,7};
sort(vecNum.beigin()), vecNum.end());
5.2、自定义排序
bool complare(int a,int b)
{return a>b; // 从大到小排序
}vector<int> vecNum{0,4,6,8,9,2,3,5,6,7};
sort(vecNum.beigin()), vecNum.end(), complare);sort(vecNum.begin(), vecNum.end(),[](int a ,int b){return a>b;
}); //使用lambda表达式
5.3、结构体排序
struct node
{int a;int b;double c;
}bool cmp(node x,node y)
{if(x.a!=y.a) return x.a<y.a;if(x.b!=y.b) return x.b>y.b;return x.c>y.c;
}
6、vector的交集、并集、补集
#include "iostream"
#include "vector"
#include "algorithm" //sort函数、交并补函数
#include "iterator" //求交并补使用到的迭代器
using namespace std;// 容器vector中元素的去重
vector<int> unique_element_in_vector(vector<int> v)
{vector<int>::iterator vector_iterator;sort(v.begin(),v.end());vector_iterator = unique(v.begin(),v.end());if(vector_iterator != v.end()){v.erase(vector_iterator,v.end());}return v;
}// 两个vector求交集
vector<int> vectors_intersection(vector<int> v1, vector<int> v2)
{vector<int> v;sort(v1.begin(),v1.end()); sort(v2.begin(),v2.end()); set_intersection(v1.begin(),v1.end(),v2.begin(),v2.end(),back_inserter(v));//求交集 return v;
}// 两个vector求并集
vector<int> vectors_set_union(vector<int> v1, vector<int> v2)
{vector<int> v;sort(v1.begin(),v1.end()); sort(v2.begin(),v2.end()); set_union(v1.begin(),v1.end(),v2.begin(),v2.end(),back_inserter(v));//求交集 return v;
}//判断vector的某一元素是否存在
bool is_element_in_vector(vector<int> v,int element)
{vector<int>::iterator it;it=find(v.begin(),v.end(),element);if (it!=v.end()){return true;}else{return false;}
}//两个vector求补集
std::vector<int> d1;
std::vector<int> d2;
std::cout << "set_different" << std::endl;
//Copies the elements from the sorted range [first1, last1)
//which are not found in the sorted range [first2, last2) to the range beginning //at d_first
std::set_difference(v1.begin(),v1.end(),result.begin(),result.end(),std::back_inserter(d1));
std::set_difference(v2.begin(),v2.end(),result.begin(),result.end(),std::back_inserter(d2));