#include <vector>
using namespace std;
创建、复制
vector<int> a; //创建一个空的vector
vector<int> a(n); //创建一个含有n个对象的vector,
//此时数据已缺省构造产生,比如现在的数组里全是0
vector<int> a(n, elem);//创建一个含有n个elem拷贝的vector
vector<int> a1(a2); //复制一个vector
vector<int> a1(begin, end); //将[begin,end)范围内的数据复制过来
访问
a.begin() 返回指向首个对象的指针,也就是一般所说的迭代器
a.end() 返回指向最后一个对象的下一个位置的指针
a.begin()+1 返回指向首个对象的下一个对象的指针
a.end()-1 返回返回指向最后一个对象的指针
a.rbegin() 返回指向最后一个对象的指针,反向迭代器
a.rend() 返回指向首个对象的前一个位置的指针,反向迭代器
a.front() 返回首个对象的数据,和*a.begin()是一样的
a.back() 返回最后一个对象的数据
a.at(i) 返回编号i位置处的对象数据,会检查数据是否存在
a[i] 返回编号i位置处的对象数据
插入
a.push_back(i); //最简单的插入,直接向vector末尾加入一个数据
a.insert(pos,elem); //向pos迭代器指向的对象前插入一个对象,注意是对象前
a.insert(pos, n, elem); //向pos迭代器指向的对象前插入n个相同对象
a.insert(pos, begin, end); //向pos迭代器指向的对象前插入[begin,end)之间的对象
后三个函数都会返回新数据的位置
删除
a.clear(); //删除所有对象
a.pop_back(); //删除最后一个对象
a.erase(pos); //删除pos迭代器对应的对象
a.erase(begin, end); //删除[begin,end)之间的对象
后两个函数会返回被删除数据的下一个位置
注意,插入和删除都会导致指向插入或者删除的迭代器之后的位置的迭代器,指针,引用失效 比如
start = a.begin(); end = a.end(); a.insert(start, elem);
//在begin前插入数据 a.erase(start, end); //会报错,因为此时end已经失效
上面的代码调整顺序以后就可以运行了:start = a.begin(); end = a.end(); it = a.erase(start, end);
//保存下删除之后的迭代器 a.insert(it, elem); //在it前插入数据 这里为了省事,没有写迭代器的具体类型
赋值
a[1] = 1; //令编号1的对象数据为1
a.assign(1, 1); //令a为{1}
a.assign(begin,end); //把另一个vector中[begin,end)中的数据赋值给a
要注意第一行和第二行结果是完全不同的,assign函数有点类似复制函数,是对整体的操作
其它常用函数:size、empty、swap、sort、reverse、accumulate
a.size() 返回vector中元素的个数
a.empty() 返回vector是否为空,空返回1,不为空返回0
a1.swap(a2); //交换a1,a2数据
swap(a1, a2); //交换a1,a2数据,同上
swap(a1[1], a1[2]); //交换a1的第2个数据和第3个数据
sort(begin, end); //对[begin,end)范围内的数据排序,放的是迭代器
reverse(begin,end); //对[begin,end)范围内的数据逆序,放的是迭代器
accumulate(begin,end,0); //做题老用到,加上吧,0代表一开始为0