C++ Primer 第九章 9.4 Vector对象是如何增长的 练习和总结

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<
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值