假设容器中的元素是连续存储的,容器的大小可变,一直向vector中添加元素会出现什么情况:如果空间不够容纳新元素,出于连续存储的特性容器不能简单地把新元素存储到内存的其他位置。容器必须申请一块新的内存,之后把原有元素移动到申请的空间上,再把新元素添加,
最后释放之前的存储空间。实际实现时不可能每添加新元素就执行一次上面的操作。
为了减少这样的情况,一般采用给vector分配更大的内存空间,比如说分配之前空间的两倍。但会出现另一种情况,内存空间扩张速度很快。
在vector中提供了一些成员函数,这使得程序员可以对容器大小进行操作。
Function Name | Description |
---|---|
shrink_to_fit() | 将capacity()减少为与size()相同大小 |
capacity() | 可以保存的元素个数 |
reverse() | 分配至少能容纳n个元素的内存空间 |
注意:reserve不会改变容器中元素的数量,只会影响vector预先分配多大的内存空间。
还需要理解capacity和size的区别。size是指容器已经保存了多少个元素,capacity指在不分配新的内存空间的前提下最多可以保存多少个元素。
capacity的值取决于标准库的实现。
vector<int>vec(16,0);
cout<<"vec:size: "<<vec.size()<<" capacity: "<<vec.capacity()<<endl;
for(int i=0;i<17;++i)
vec.push_back(i);
cout<<"vec:size: "<<vec.size()<<" capacity: "<<vec.capacity()<<endl;
可以简单测试一下,就能很快理解capacity和size的区别。而且多测试几遍能发现,capacity大小一直翻倍。
可以调用shrink_to_fit来归还多余的内存。但该函数只是一个请求,标准库不一定会归还内存。
记住只有在执行insert操作时size与capacity相等的情况下,以及调用resize或reserve时给的大小超过当前capacity,vector才会重新分配内存空间。