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 
#include 

using namespace std;

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

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

using namespace std;

int main(void)
{
	vector vecSize;
	vector 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 
#include 

using namespace std;

int main(void)
{
	vector 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()的事。


你可能感兴趣的:(c++)