与普通数组array不同,vector是动态空间,它支持随机存取,在集合尾端增删元素很快,但是在集合中间增删元素比较费时。随着元素的加入,它会自行扩充空间来容纳新元素,这些特性都是vector实现技术的关键所在。
一.vector成员函数:
首先了解vector的各个成员函数的作用:
1.访问元素的方法
vec[i]
- 访问索引值为 i 的元素引用。vec.at(i)
- 访问索引值为 i 的元素的引用,以 at() 访问会做数组边界检查,如果访问越界将会抛出异常。vec.front()
- 回传 vector 第一个元素的引用。vec.back()
- 回传 vector 最尾元素的引用。
2.新增或移除元素的方法
vec.push_back()
- 新增元素至 vector 的尾端,必要时会进行存储器配置。vec.pop_back()
- 删除 vector 最尾端的元素。vec.insert()
- 插入一个或多个元素至 vector 内的任意位置。vec.erase()
- 删除 vector 中一个或多个元素。vec.clear()
- 清空所有元素。
3.取得长度/容量
vec.size()
- 取得 vector 目前持有的元素个数。vec.empty()
- 如果 vector 内部为空,则传回 true 值。vec.capacity()
- 取得 vector 目前可容纳的最大元素个数。通常只会增加,不会因为元素被删减而随之减少。
4.重新配置/重设长度
vec.reserve()
- 如有必要,可改变 vector 的容量大小。vec.resize()
- 改变 vector 目前持有的元素个数。
5.迭代器
vec.begin()
- 回传一个Iterator,它指向 vector 第一个元素。vec.end()
- 回传一个Iterator,它指向 vector 最尾端元素的下一个位置(请注意:它不是最末元素)。vec.rbegin()
- 回传一个反向Iterator,它指向 vector 最尾端元素的。vec.rend()
- 回传一个Iterator,它指向 vector 的第一个元素。
二.vector内存配置
vector实现关键在于在于其对大小的控制以及重新配置是的数据移动效率。
vector采用线性连续空间。为了降低控制配置时的速度成本,vector实际配置的大小可能比客户端的需求量更大一些,用来满足后续需要,这就是capacity的观念。动态增加大小并不是在原空间之后增加新空间,而是以原大小的两倍另外配置一块较大的空间,然后将原内容拷贝过来,然后原内容之后构造新元素,并释放原空间。所以一旦vector空间重新配置,指向vector的迭代器全部失效。
通过一个测试程序来重点理解vector的size()、resize()和reserve()三个函数:
#include <iostream> #include <vector> using namespace std; void Print(vector<int> &ans) { cout<<"ans的成员是:"; for(vector<int>::iterator iter=ans.begin();iter!=ans.end();iter++) cout<<*iter<<" "; cout<<endl<<"ans的size是:"<<ans.size()<<endl; cout<<"ans的capacity是:"<<ans.capacity()<<endl<<endl; } int main() { int a[5]={1,2,3,4,5}; vector<int> ans(a,a+5); //定义一个vector并初始化 Print(ans); ans.push_back(6); //新增一个元素6 Print(ans); ans.resize(3); //将ans中元素减少到3个 Print(ans); ans.resize(10,7); //将ans中元素增加到10个,未定义的初始化为7 Print(ans); ans.reserve(20); //增加ans的容量到20 Print(ans); ans.~vector(); //析构释放内存 Print(ans); return 0; }
结果如下:
一般来说vector的所占内存只能增大不会减小,生命结束时会在自动调用析构函数释放内存。当然了,我们可以利用一个小技巧释放内存,如下:
vector<int> num1; vector<int> num2(10); cout<<num2.capacity()<<endl; num2.swap(num1); cout<<num2.capacity()<<endl;
参考:
1.维基百科:http://zh.wikipedia.org/wiki/Vector_(STL)(它的实验好像不对 = =!)
2.《STL源码剖析》