STL中vector的扩容和回收
一、求容器大小的函数:size():返回当前vector元素的个数。capacity():返回当前vector中最大能够存储的元素的个数。二、扩容的两种情况:情况1:当元素添加时导致的扩容。int main(){vector<int> vec;//扩容1:当元素添加时导致的扩容。VS2012采用的是1.5倍的扩容方式for(int i=0;i&l...
一、求容器大小的函数:
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(),释放空间并且回收内存。
更多推荐
所有评论(0)