vector的reserve()和resize()

vector 的reserve()增加了vector的capacity,但是它的size没有改变!resize()改变了vector的capacity同时也增加了它的size!


reserve(n) 预分配n个元素的存储空间。

reserve()可按以下实现:
如果n大于容器现有的容量(即capacity()),则需要在自由内存区为整个容器重新分配一块新的更大的连续空间,其大小为n*sizeof(Type),然后将容器内所有有效元素从旧位置全部拷贝到新位置(调用拷贝构造函数),最后释放旧位置的所有存储空间并调整容器对象的元素位置指示器(就是让那3个指针指向新内存区的相应位置)。也就是说,如果请求容量比原有容量大的话,结果是容器的冗余容量加大,而容器本身的有效元素不会发生任何变化,即容器的大小并没有改变。如果n小于或等于现有容量,则什么也不做。


1、resize(n)

调整容器的长度大小,使其能容纳n个元素。

如果n小于容器的当前的size,则删除多出来的元素。否则,添加采用值初始化的元素。

2、 resize(n,t)

多一个参数t,将所有新添加的元素初始化为t。


void resize(size_type n, const T&c=T());

其中n就是最后要保持的元素个数,如果需要新增元素的话,c则是新增元素的默认初始值。resize()实现策略:

如果n大于容器当前的大小(即size()),则在容器的末尾插入(追加)n-size()个初始值为c的元素,如果不指定初始值,则用元素类型的默认构造函数来初始化每一个新元素。如果n小于容器当前的大小,则从容器的末尾删除size()-n个元素,但不释放元素本身的内存空间,因此容量不变。

否则,什么也不做。


了解这两个函数的区别,首先要搞清楚容器的capacity(容量)与size(长度)的区别。
size指容器当前拥有的元素个数;
而capacity则指容器在必须分配新存储空间之前可以存储的元素总数。
也可以说是预分配存储空间的大小。

#include<iostream>
#include<vector>
using namespace std;
int main()
{
	vector<int> v;
	v.reserve(100);//元素尚未构造,无法访问

	//cout << v[1] << endl;//error
	for (int i = 0; i < 100; i++)
		v.push_back(i);//新元素构造

	v.resize(102);
	cout << v[101];//在VS2015上默认为0,使用resize()后可以访问数据
	v[101] = 101;//right

	return 0;
}


#include<iostream>
#include<vector>
using namespace std;
int main()
{
	vector<int> vect;

	vect.push_back(1);
	vect.push_back(2);
	vect.push_back(3);
	vect.push_back(4);

	vect.reserve(100);
	cout << vect.size() << endl;  //4
	cout << vect.capacity() << endl; //100

	/*
        for (int i = 0; i < 100; i++)
	     cout << vect[i] << endl;//error
        */
	return 0;
}






#include<iostream>
#include<vector>
using namespace std;
int main()
{
	vector<int> vect;

	vect.push_back(1);
	vect.push_back(2);
	vect.push_back(3);
	vect.push_back(4);

	vect.resize(100);    //新的空间不覆盖原有四个元素占有的空间,现在size和capacity都是100

	cout << vect.size() << endl;
	cout << vect.capacity() << endl;

	for (int i = 0; i < 100; i++)
		cout << vect[i] << endl;//now right!
	

	return 0;
}



#include<iostream>
#include<vector>
using namespace std;
int main()
{
	vector<int> vect;

	vect.resize(100);    //分配100个空间

	vect.push_back(1);
	vect.push_back(2);
	vect.push_back(3);
	vect.push_back(4);

	cout << vect.size() << endl; //  104
	cout << vect.capacity() << endl;//(VS2015上是) 150
	//现在size是104,capacity至少是104
	for (int i = 0; i < 104; i++)
		cout << vect[i] << endl;
	

	return 0;
}





  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值