9.4 Vector对象是如何增长的
vector对象为了支持快速随机访问,其物理存储方式是连续存储的,又因为vector是动态大小的,所以这就涉及到了一个问题。
如果当前的vector容器分配的存储空间空间已经满了,不能再添加新的元素,那么就需要重新分配一块内存空间,将原来的值复制过去并添加新的元素。
但是如果每次添加都重新分配内存空间的话,vector的效率会非常的低。
所以为了避免这种低效的方式,vector有自己的内存增长方式,需要注意的是,这种增长方式不同的标准库实现者策略是不同的。
总的来说,vector和string通常会分配比新空间需求(新空间需求即:容器当前需要存进去多少元素)更大的内存空间。
和容量相关的成员函数如下:
1.之前说了容器实际能够容纳的元素个数通常大于或者等于当前的需求,也就是容器会有多余的空间,使用shrink_to_fit()可以收回多余的空间,但是这依赖于标准库的实现者,实现者有权不收回多余的空间。
2.capacity,表示容器在不重新分配内存空间的情况下,最多可以容纳多少元素。
3.reserve,改变容器的capacity。需要注意的是,reserve(n)分配的内存空间是小于等于capacity的。且当n小于容器当前实际存储的元素个数时,reserve是不会其作用的。也就是说reserve的n只是一个参考,当n<size()时,reserve不会起作用,当n>size()时,capacity()>=n
capacity()和size()的区别
前者表示在不重新分配内存空间的情况下,最多可以容纳多少元素。
后者表示当前容纳了多少元素。
resize()和reserve()的区别
resize()改变的是size()的大小,但是如果resize(n),n大于capacity(),就会改变capacity(),reserve()改变的是capacity()的大小,reserve(n),n<=capacity()
只有在insert(push_back也算insert),size==capacity(),或者resize(n),reverse(n)中的n大于capacity()时,vector才会重新分配内存空间
练习
9.35
capacity表示vec在不重新分配内存空间的情况下,最多可以容纳多少元素
size()表示vec当前以及容纳多少元素
9.36
capacity()永远>=size()
9.37
这个list,array的存储接口有关,list在内存上并不是连续存储的,所以插入新元素时,可以直接分配新的内存空间。array的内存是固定的,所以没法开辟新的存储空间,size()就是它的最大容量。
9.38
VS2017的标准库
vector<int> vec;
cout << "size:" << vec.size() << "capacity:" << vec.capacity() << endl;
vec.push_back(1);
cout << "size:" << vec.size() << "capacity:" << vec.capacity() << endl;
for (int i = 0; i < 10;i++) {
vec.push_back<