c++中vector容器中capacity函数和size函数的区别_代码讲解

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

在这里插入图片描述

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值