c++中vector容器中capacity函数和size函数的区别

it2023-10-02  69

首先介绍一段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;

最新回复(0)