一句话vector:vector的空间可扩充,支持随机存取访问,是一段连续线性的空间。所以它是动态空间,与之对比的array是静态的空间,不可扩充。简单来说,vector是数组的增强版。
vector创建与遍历
vector提供了几个版本的构造函数。详见:http://www.cplusplus.com/reference/stl/vector
比如:
vector<int> iv(3,3); /*3,3,3*/
又或:
......
vector<int>::iterator beg = iv.begin(),
end = iv.end();
cout << *beg << endl;
......
vector删除
在经常需要删除操作earse()(插入操作也一样insert())的地方,不建议使用vector容器,因为删除元素会导致内存的复制,无疑增加系统开销。最为极端的情况,删除vector首部的元素:
a b c d e f g h
b c d e f g h h
b c d e f g h
当然,有更好的做法,为了避免内存复制,在删除的时候,将需要删除的目标与vector尾端的元素交换,然后才执行删除操作,但这无疑也增加了一个指向vector尾端元素的空间开销。
a b c d e f g h
h b c d e f g a
h b c d e f g
vector陷阱
需要注意的是,vector备用空间是有限的,当发现备用空间不够用的时候,vector是另外新分配一个比原有更大的空间(原有空间*2),然后把原有的内容倒腾到新的空间上去,接着释放原有的空间。所以迭代器的使用就要特别小心了,在插入元素之后,很可能之前声明定义的迭代器都失效了。
......
vector<int> iv(3,3);
iv.push_back(10); /*3,3,3,10*/
vector<int>::iterator beg = iv.begin(),
end = --iv.end();
cout << iv.size() << " " << *beg << " " << *end << endl; /*4 3 10*/
iv.push_back(20);
cout << iv.size() << " " << *beg << " " << *end << endl; /*bomb.invalid iterator.*/
......
vector元素排序
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
vector<int> iv(3,3);
unsigned int i;
/*add new elem.*/
iv.push_back(10);
iv.push_back(9);
iv.push_back(0);
vector<int>::iterator beg = iv.begin(),
end = iv.end();
/*print.*/
for(i=0; i<iv.size(); i++)
cout << iv[i] << " ";
cout << endl;
/*sort.*/
sort(beg,end);
/*print.*/
for(i=0; i<iv.size(); i++)
cout << iv[i] << " ";
cout << endl;
return 0;
}
3 3 3 10 9 0
0 3 3 3 9 10
请按任意键继续. . .
vector查找
按上述遍历元素的方法查找,复杂度为O(n)。STL算法实现了find(),可以在指定的迭代器始末寻找指定的元素。
......
vector<int> iv(3,3);
unsigned int i;
/*add new elem.*/
iv.push_back(10);
iv.push_back(9);
iv.push_back(0);
vector<int>::iterator beg = iv.begin(),
end = iv.end(),
ret;
ret = find(beg,end,10);
cout << *ret << endl;
......
建议
之于array,vector虽略胜一筹,但有它的硬伤,那就是它动态增大的时候,空间操作耗费大,特别是当vector内的元素很多的时候。
vector还提供insert,earse,clear等元素的操作,不一一复述。最后是很不错的vector文档:http://www.cplusplus.com/reference/stl/vector/
本文完 2012-10-16
Dylan http://daoluan.github.io/
15 October 2012 会持续更新