[STL]vector
与普通数组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源码剖析》

浙公网安备 33010602011771号