STL中vector的扩容和回收

一、求容器大小的函数:

size():返回当前vector元素的个数。

capacity():返回当前vector中最大能够存储的元素的个数。

二、扩容的两种情况:

情况1:当元素添加时导致的扩容。

int main()
{
	vector<int> vec;
	
	//扩容1:当元素添加时导致的扩容。VS2012采用的是1.5倍的扩容方式
	for(int i=0;i<30;i++)
	{
		vec.push_back(i);
		cout<<"size="<<vec.size()<<endl;
		cout<<"capacity="<<vec.capacity()<<endl;
	}
	cout<<"---------------------------------------------"<<endl;
	return 0;
}

运行结果:

可以看出对于普通的添加元素,vector在VS2012采用的是1.5倍的扩容方式。其他编译器我还没有测试,先记着,等到测试了再补充。

情况2:使用reserve(int new_size)或者resize(int new_size,/*int init_value*/)函数导致的扩容。两者都是将容器扩大到恰好容纳指定的元素。

reserve(int new_size):

a.将容器扩大到能容纳new_size的大小。

b.扩大的只是容器的预留空间,空间内不正真创建元素对象。

c.改变capacity()的返回值,不改变size()的返回值。

int main()
{
	vector<int> vec;
	
	for(int i=0;i<30;i++)
	{
		vec.push_back(i);
		cout<<"size="<<vec.size()<<endl;
		cout<<"capacity="<<vec.capacity()<<endl;
	}
	cout<<"---------------------------------------------"<<endl;

	//reserve()只为容器开辟预留空间,但在空间内不真正创建对象。
	//reserve()会改变容器capacity()的大小,但是不会改变容器size的大小。
	vec.reserve(50);
	cout<<"size="<<vec.size()<<endl;//30
	cout<<"capacity="<<vec.capacity()<<endl;//50
	/*for(int j=30;j<50;j++)//自己手动插入
	{
		vec.push_back(j);
	}*/
	//vec[36]=8;//自己不插入时,不能访问
	copy(vec.begin(),vec.end(),ostream_iterator<int>(cout," "));
	return 0;
}

 

resize(int new_size,/*int init_value*/):

 

a.第一个参数是指将要扩大到能容纳多少元素的大小;第二个参数是对扩大的空间进行初始化的值,如果不写,默认调用容器中存的元素的默认构造函数。

b.将容器扩大到能容纳new_size的大小。

c.改变容器的大小,并且创建对象。

d.改变capacity()的返回值,改变size()的返回值。

int main()
{
	vector<int> vec;
	
	for(int i=0;i<30;i++)
	{
		vec.push_back(i);
		cout<<"size="<<vec.size()<<endl;
		cout<<"capacity="<<vec.capacity()<<endl;
	}
	cout<<"---------------------------------------------"<<endl;

	//resize()会改变容器的大小,而且创建对象。
	//resize改变容器的capacity()和容器的size()的大小。
	//resize(int new_size,int init_value)第一个参数是容器新的大小,
	//第二个参数是对开辟的内存的初始化,如果省略第二个参数,则调用其默认构造函数。
	vec.resize(50);

	vector<int>::iterator it=vec.begin();
	for(;it!=vec.end();++it)
	{
		cout<<*it<<endl;
	}
	cout<<"size="<<vec.size()<<endl;//50
	cout<<"capacity="<<vec.capacity()<<endl;//63
	
	vec[49]=49;//可修改
	cout<<"vec[49]="<<vec[49]<<"  "<<"vec[36]="<<vec[36]<<endl;

	return 0;
}

三、容器的的回收

int main()
{
	vector<int> vec;
	
	for(int i=0;i<30;i++)
	{
		vec.push_back(i);
		cout<<"size="<<vec.size()<<endl;
		cout<<"capacity="<<vec.capacity()<<endl;
	}
	cout<<"---------------------------------------------"<<endl;

	//释放空间
	vec.clear();
	cout<<"size="<<vec.size()<<endl;//0
	cout<<"capacity="<<vec.capacity()<<endl;//42

	vec.erase(vec.begin(),vec.end());
	cout<<"size="<<vec.size()<<endl;//0
	cout<<"capacity="<<vec.capacity()<<endl;//42   
        /*
	第一步:先产生一个和原先一样的临时对象
	第二步:临时量调用swap()函数两者进行交换。
	第三步:语句结束,临时量自动析构。
	*/
	vector<int>().swap(vec);
	/*
	vector<int>(vec).swap(vec);  ===>   vec.swap(vector<int>())
	*/

	cout<<"size="<<vec.size()<<endl;//0
	cout<<"capacity="<<vec.capacity()<<endl;//0
	return 0;
}	第一步:先产生一个和原先一样的临时对象
	第二步:临时量调用swap()函数两者进行交换。
	第三步:语句结束,临时量自动析构。
	*/
	vector<int>().swap(vec);
	/*
	vector<int>(vec).swap(vec);  ===>   vec.swap(vector<int>())
	*/

	cout<<"size="<<vec.size()<<endl;//0
	cout<<"capacity="<<vec.capacity()<<endl;//0
	return 0;
}

总结:

使用clear()和erase()两个函数只是清空元素,但不回收内存。

先使用clear()再使用swap(),释放空间并且回收内存。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值