C++学习笔记之——vector的size和capacity、resize和reserve的区别

在使用STL中的vector时,对于size和capacity、resize和reserve的使用很是模糊。于是这篇博文就诞生了,主要是加深自己的理解和方便日后查阅。

在vector中size()和capacity()属性分别对应着resize(size_type)和reserve(size_type)这两个方法。

为此,我们先来看看size()和capacity()属性的区别:

  • size: 表示实际容器中保存元素的个数
  • capaciy: 表示在发生重新分配之前允许存放多少元素
弄清楚了这两个概念,我们再来看看对应的resize(size_type)和reserve(size_type)这两个方法:
  • resize(size_type): 对某个vector容器调用resize方法会在该容器尾部添加或删除一些元素,使容器达到指定的大小。
  • reserve(size_type): 对某个vector容器调用reserve方法仅仅设置capacity这个值。
注意:reserve(size_type)只是改变了capaciy的值,此时这些内存空间可能还是“野”的。如果使用[]操作符进行访问,可能出现数组越界问题。

下面,我们给出一些测试程序来说明:
#include <iostream>
#include <vector>

using namespace std;

int main(void)
{
	vector<int> vecSize;
	vector<int> vecCapacity;

	vecSize.resize(2);
	cout << "vecSize.size() = " << vecSize.size() << ", vecSize.capacity() = "<< vecSize.capacity() <<endl;

	vecCapacity.reserve(2);
	cout << "vecCapacity.size() = " << vecCapacity.size() << ", vecCapacity.capacity() = " << vecCapacity.capacity() << endl;

	return 0;
}
输出如下:
vecSize.size() = 2, vecSize.capacity() = 2
vecCapacity.size() = 0, vecCapacity.capacity() = 2
从输出结果我们可以看出resize方法会使vector容器拥有指定个数的元素,而reserve只是改变capaciy的值。
接下来我们来看看下个例子:
#include <iostream>
#include <vector>

using namespace std;

int main(void)
{
	vector<int> vecSize;
	vector<int> vecCapacity;

	vecSize.resize(2);
	vecCapacity.reserve(2);

	//这里我们使用at函数来进行访问,at函数会进行下标越界检查
	vecSize.at(0) = 1;
	vecCapacity.at(0) = 2;

	return 0;
}
上面的测试程序在运行时会接收到std::out_of_range异常。这也说明了reserve只是改变capaciy的值此时这些内存空间可能还是“野”的。如果使用[]操作符进行访问,可能出现数组越界问题。
最后,我们在来看看resize方法对size和capacity的影响。
#include <iostream>
#include <vector>

using namespace std;

int main(void)
{
	vector<int> vecInt;
	cout << "vecInt.size() = " << vecInt.size() << ", vecInt.capacity() = " << vecInt.capacity() << endl;

	vecInt.resize(1024);
	cout << "vecInt.size() = " << vecInt.size() << ", vecInt.capacity() = " << vecInt.capacity() << endl;

	vecInt.resize(1500);
	cout << "vecInt.size() = " << vecInt.size() << ", vecInt.capacity() = " << vecInt.capacity() << endl;

	return 0;
}
输出结果如下所示:
vecInt.size() = 0, vecInt.capacity() = 0
vecInt.size() = 1024, vecInt.capacity() = 1024
vecInt.size() = 1500, vecInt.capacity() = 1536
这是vector的一个好处它的capacity()机制减少了内存分配的次数。等于说resize()还替我们做了reserve()的事。


  • 4
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值