Vector
Vector描述的是一个动态数组(dynamic array),并提供了相关操作和接口。
在使用Vector之前,需要引入头文件#include<vector>
,在此头文件中,类型vector是一个定义于namespace std内的template:
template<
class T,
class Allocator = std::allocator<T>
> class vector;
其中T可以是任意类型,Allocator用来定义内存模型,默认是C++标准库提供的allocator
Vector的能力
Vector将元素复制到dynamic array内部,是一种动态的顺序表结构。Vector支持随机访问,可以以常量时间访问元素,Vector支持随机访问迭代器,以及STL提供的任何算法(排序、查找等)。但对于插入、删除和移动等操作,Vector效率较低(类似于数组的特性)。
大小(size)和容量(capacity)
vector区别于一般数组的特性之一就是能够动态的“扩容”,在容量能够容纳所有元素的前提下,提供基于pointer、reference、iterator的访问,以及元素的操作等,因此,大小和容量的概念至关重要。
Vector的大小(size)是指当前元素所占用空间,而容量(capacity)则是指vector分配内存预留大小,当size超过capacity时,vector会自动进行扩容,重新分配内存。举个例子——
vector<int> v;
for (int i=0; i < 20; i++) {
v.push_back(i);
cout<<"i = "<<i
<< " size = " << v.size()
<< " capacity = " << v.capacity() << endl;
}
可以看出,vector的大小是随着插入元素不断增加的,也就是说,size()的作用其实和sizeof的作用类似,但是由于vector都是reference语义的操作,sizeof一个vector对象,无法得到实际大小,所以vector提供了size成员函数。而capacity()则反映了vector的动态扩容机制。
vector容量的概念之所以重要,有两个原因——
1.一旦内存重新分配,vector相关元素的所有reference、pointer、iterator都会失效。这里的失效是指,原来的值需要更新到重新分配后的内存地址。
2.内存的重新分配需要一定时间。
reserve函数
通过reserve函数可以显式的指定预留空间的大小,而避免vector反复的进行内存重新分配, 从而提高vector的使用效率。但reserve不能减小vector容量,比如,已存在vector.capacity = 100,使用reserve(80)不会有任何作用。
vector<int> v(100);
cout<<v.size()<<" "<<v.capacity()<<endl;
v.reserve(80);
cout<<v.size()<<" "<<v.capacity()<<endl;
此外,还可以通过vector的构造函数显式的指定容量大小,比如:
vector<int>