一、vector特点
优点:支持随机存取,方便在末端添加或删除元素。
缺点:在前端或中部安插、删除元素性能就不怎么好。
二、vector构造和析构
vector<Elem> c; //产生一个空vector,其中没有任何元素
vector<Elem> c1(c2); //产生另一个同型vector的副本(所有元素都被拷贝)
vector<Elem> c(n); //利用元素的default构造函数产生一个大小为n的vector
vector<Elem> c(n,elem); //产生一个大小为n的vector,元素均为elem
vector<Elem> c(beg,end); //产生一个vector,以区间[beg,end]作为元素初值
c.~vector<Elem>(); //销毁所有元素,并释放内存
三、非变动性操作
c.size() //返回当前元素数量
c.empty() //判断大小是否为0
c.max_size() //返回可容纳的元素最大数量
capacity() //返回重新分配空间前容器所能容纳的元素最大数量
reserve() //如果容器不足,进行扩大
四、赋值操作
c1 = c2 //将c2的元素全部赋值给c1
c.assign(n,elem);
c.assign(beg,end);
c1.swap(c2);
swap(c1,c2);
五、元素存取
c.at(idx) //返回索引idx所标示的元素,如果idx越界,则抛出out_of_range
c[idx] //返回索引idx所标示的元素,不进行范围检查
c.front() //返回第一个元素,不检查第一个元素是否存在
c.back() //返回最后一个元素,不检查最后一个元素是否存在
六、vector迭代器相关函数
c.begin() //返回一个随机存取迭代器,指向第一个元素
c.end() //返回一个随机存取迭代器,指向最后元素的下一位置
c.rebegin() //返回一个逆向迭代器,指向逆向迭代的第一个元素
c.rend() //返回一个逆向迭代器,指向逆向迭代的最后元素的下一位置
七、安插、移除等相关操作
c.insert(pos,elem) //在pos位置插入一个elem副本,并返回新元素位置
c.insert(pos,n,elem) //在pos位置插入n个elem副本,无回传值
c.insert(pos,beg,end) //在pos位置上插入区间[beg,end]内的所有元素副本,无回传值
c.push_back(elem) //在尾部添加一个elem副本
c.pop_back() //移除最后一个元素(但不回传)
c.erase(pos) //移除pos位置上的元素,返回下一元素的位置
c.erase(beg,end) //移除[beg,end]区间的所有元素,返回下一元素的位置
c.resize(num) //将元素数量改为num(如果size()变大了,多出来的新元素都需default构造函数完成)
c.resize(num,elem) //将元素数量改为num(如果size()变大了,多出来的新元素都是elem)
c.clear() //移除所有元素,将容器清空
移除与某值相等的第一个元素:
std::vector<Elem> coll;
std::vector<Elem>::iterator pos;
pos = find(coll.begin(),coll.end(),value);
if(pos!=coll.end())
{
coll.erase(pos);
}
如果需要移除所有与某值相等的元素
std::vector<Elem> coll;
coll.erase(remove(coll.begin(),coll.end(),
value),
coll.end());
八、将vector当做一般Arrays使用
注意:千万不要把迭代器当做第一元素的地址来传递,vector迭代器是由实作版本定义的,也许并不是一般指针
printf("%s\n",v.begin()); //ERROR,(might work,but not portable)
printf("%s\n",&v[0]); //OK
九、运用实例
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
#include <iterator>
using namespace std;
int main()
{
// create empty vector for strings
vector<string> sentence;
// reserve memory for five elements to avoid reallocation
sentence.reserve(5);
// append some elements
sentence.push_back("Hello,");
sentence.push_back("how");
sentence.push_back("are");
sentence.push_back("you");
sentence.push_back("?");
// print elements separated with spaces
copy (sentence.begin(), sentence.end(),
ostream_iterator<string>(cout," "));
cout << endl;
// print ``technical data''
cout << " max_size(): " << sentence.max_size() << endl;
cout << " size(): " << sentence.size() << endl;
cout << " capacity(): " << sentence.capacity() << endl;
// swap second and fourth element
swap (sentence[1], sentence[3]);
// insert element "always" before element "?"
sentence.insert (find(sentence.begin(),sentence.end(),"?"),
"always");
// assign "!" to the last element
sentence.back() = "!";
// print elements separated with spaces
copy (sentence.begin(), sentence.end(),
ostream_iterator<string>(cout," "));
cout << endl;
// print ``technical data'' again
cout << " max_size(): " << sentence.max_size() << endl;
cout << " size(): " << sentence.size() << endl;
cout << " capacity(): " << sentence.capacity() << endl;
}