[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源码剖析》

3.vector内存释放机制  

原文地址:https://www.cnblogs.com/Rosanna/p/3511355.html