首先介绍一段c++ primer书上的内容,再结合代码去理解,会好理解一点。
vector对象是如何增长的(第五版P356)
~~~~~~ 为了支持快速随机访问,vector将元素连续存储–每个元素紧挨着前一个元素存储。
~~~~~~ 假定容器中元素是连续存储,且容器的大小是可变的,考虑想vector和string中添加元素会发生什么:如果没有空间容纳新元素,容器不可能简单的将它添加到内存中的其他位置–因为元素必须连续存储。容器必须分配新的内存空间来保存已有元素和新元素,将已有元素移动到新空间中,然后添加新元素,释放旧空间。如果每添加一个新的元素,vector就执行一次这样的内存分配和释放操作,性能就会慢到不可接受。(这句话感觉就是起因)
~~~~~~ 为了避免这种代价,标准库实现者采用了减少容器重新分配空间次数的策略(重点)。当不得不获取新的内存空间vector和string的实现通常会分配比新的空间需要更加大的内存空间。容器预留这些空间作为备用(这就是造成size有时候不等于capacity的原因),可以保持更多的元素。这样就不用每次添加新元素都重新分配容器的内存空间了。
管理容量的成员函数
shrink_to_fit只适用于vector,string和deque
capacity和resever只适用于vector和string
①v.shrink_to_fit()
~~~~~~~~~
请将capacity()减少到size()相同大小
②v.capacity()
~~~~~~~~~
不重新分配内存的话,v可以保持多少元素
③v.reverse(n)
~~~~~~~~~
分配至少可以容纳n个元素的内存空间
reserve()函数并不改变容器中元素的数量,它仅影响vertor预先分配多大的内存空间。
代码讲解:
vector<int>v{ 0,1,2,3,4,5,6,7,8,9 };//直接列表初始化,这个时候元素个数size和capacity应该是一样的
cout << v.size() << endl;
cout << v.capacity() << endl;
~~~~~~
这个时候,如果添加元素的话,那么vector就要重新分配内存了,按照书上的解释,重新分配内存的话,肯定会预留空间,这个时候size和capacity肯定不同,size<=capacity
vector<int>v{ 0,1,2,3,4,5,6,7,8,9 };
cout << v.size() << endl;
cout << v.capacity() << endl;
v.push_back(10);//添加一个元素,vector需要重新分配内存
cout << endl;
cout << v.size() << endl;
cout << v.capacity() << endl;
size=11,capacity=15,预留四个int型空间。
最后再解释一下v.shrink_to_fit()函数和reverse()函数
vector<int>v{ 0,1,2,3,4,5,6,7,8,9 };
cout << v.size() << endl;
cout << v.capacity() << endl;
v.push_back(10);
cout << endl;
cout << v.size() << endl;
cout << v.capacity() << endl;
v.shrink_to_fit();//请将capacity()减少到size()相同大小
cout<<v.capacity();
vector<int>v{ 0,1,2,3,4,5,6,7,8,9 };
cout << v.size() << endl;
cout << v.capacity() << endl;
v.push_back(10);
cout << v.size() << endl;
cout << v.capacity() << endl;
//reserve()函数并不改变容器中元素的数量,它仅影响vertor预先分配多大的内存空间。
v.reserve(16);//希望预分配16个元素的空间
cout << v.capacity() << endl;
v.shrink_to_fit();//将空间变成和目前已有元素空间的大小
cout<<v.capacity()<<endl;