admin管理员组文章数量:1611549
首先介绍一段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;
版权声明:本文标题:c++中vector容器中capacity函数和size函数的区别_代码讲解 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://www.elefans.com/dianzi/1728619901a1166217.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论