vector内部维护了start,finish,end_of_storage三个迭代器,分别表示目前使用空间的头、尾及目前可用空间的尾。当空间不够使用时,会动态增长。
一些常用的元素操作方法如下:
front //第一个元素
back //最后一个元素
push_back //将一个元素插入vector尾部
insert //指定位置插入
pop_back //清除最后一个元素
erase //清除某个元素
begin
end
resize //调整容量方法
reserve //保留n个空间的方法,在知道vector的容量下,调用此方法可以提高效率,避免vector的重建
size 元素的个数
capacity // vector的空间大小 >= size
empty 其实现如下:
bool empty() const
{return begin() == end(); }
clear //本质上是调用了erase,只是析构了对象,但并没有销毁空间,如果要销毁空间,请用swap,用法如下:
{
vector<T> vecTemp;
vecTemp.swap(vec); //vec为待释放的对象,这样离开作用域后对象会被释放
}
其调用了algorithm中的swap,实现如下:
void swap(vector<_Tp, _Alloc>& __x) {
__STD::swap(_M_start, __x._M_start);
__STD::swap(_M_finish, __x._M_finish);
__STD::swap(_M_end_of_storage, __x._M_end_of_storage);
}
vector的插入操作(调用insert和push_back),如果可用空间不足的话,vector会重新分配空间(重分配的空间为原来的2倍,或2倍以上),然后将原内容拷贝过去并释放原来的空间。因此,对vector的任何操作,一旦引起空间重新配置,指向原vector的所有迭代器就都失效了。
vector支持随机存储操作,其使用的迭代器是RandomAccessIterator
当已知插入元素的数量时,可以事先使用reserve函数来分配足够大小的内存,防止内存的重复分配和释放,提高效率。vector的插入和删除操作效率较差,如果这两种操作比较频繁,请使用list或set/map。
需要指出的是,vector是非异步安全的,如涉及多线程操作的话,需要自行采取同步措施。