vector求容器大小的函数:
size():返回当前vector元素的个数。
capacity():返回当前vector中最大能够存储的元素的个数。
vector的扩容
情况1:默认扩容(元素添加)
int main()
{
vector<int> vec;
//扩容1:当元素添加时导致的扩容。扩容为1.5或者2倍,跟编译器有关。
for(int i=0;i<5;i++)
{
vec.push_back(i);
cout<<"size="<<vec.size()<<endl;
cout<<"capacity="<<vec.capacity()<<endl;
}
cout<<"---------------------------------------------"<<endl;
return 0;
}
输出:
size=1
capacity=1
size=2
capacity=2
size=3
capacity=4
size=4
capacity=4
size=5
capacity=8
---------------------------------------------
情况2:使用reserve()和resize()函数导致的扩容
reserve(int new_size)
- 将容器扩大到能容纳new_size的大小
- 扩大的只是容器的预留空间,空间内不正真创建元素对象
- 改变capacity()的返回值,不改变size()的返回值
int main()
{
vector<int> vec;
for(int i=0;i<5;i++)
{
vec.push_back(i);
cout<<"size="<<vec.size()<<endl;
cout<<"capacity="<<vec.capacity()<<endl;
}
cout<<"---------------------------------------------"<<endl;
//reserve()只为容器开辟预留空间,但在空间内不真正创建对象。
//reserve()会改变容器capacity()的大小,但是不会改变容器size的大小。
vec.reserve(10);
cout<<"size="<<vec.size()<<endl;//30
cout<<"capacity="<<vec.capacity()<<endl;//50
copy(vec.begin(),vec.end(),ostream_iterator<int>(cout," "));
return 0;
}
输出:
size=1
capacity=1
size=2
capacity=2
size=3
capacity=4
size=4
capacity=4
size=5
capacity=8
---------------------------------------------
size=5
capacity=10
0 1 2 3 4
resize(int new_size, int init_value)
-
第一个参数是指将要扩大到能容纳多少元素的大小;第二个参数是对扩大的空间进行初始化的值,如果不写,默认调用容器中存的元素的默认构造函数。
-
将容器扩大到能容纳new_size的大小。
-
改变容器的大小,并且创建对象。
-
改变capacity()的返回值,改变size()的返回值。
int main()
{
vector<int> vec;
for(int i=0;i<5;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(10);
vector<int>::iterator it=vec.begin();
for(;it!=vec.end();++it)
{
cout<<*it<<‘ ’;
}
cout<<"size="<<vec.size()<<endl;//50
cout<<"capacity="<<vec.capacity()<<endl;//63
vec[9]=9;//可修改
cout<<"vec[9]="<<vec[9]<<" "<<"vec[8]="<<vec[8]<<endl;
return 0;
}
输出:
size=1
capacity=1
size=2
capacity=2
size=3
capacity=4
size=4
capacity=4
size=5
capacity=8
---------------------------------------------
0 1 2 3 4 0 0 0 0 0
size=10
capacity=16
vec[9]=9 vec[8]=0
vector的回收
int main()
{
vector<int> vec;
for(int i=0;i<5;i++)
{
vec.push_back(i);
cout<<"size="<<vec.size()<<endl;
cout<<"capacity="<<vec.capacity()<<endl;
}
cout<<"---------------------------------------------"<<endl;
//释放空间
vec.clear();
cout<<"size="<<vec.size()<<endl;
cout<<"capacity="<<vec.capacity()<<endl;
vec.erase(vec.begin(),vec.end());
cout<<"size="<<vec.size()<<endl;
cout<<"capacity="<<vec.capacity()<<endl;
// 最简单的方法
vector<int>(vec).swap(vec); //vec.swap(vector<int>())
/*
第一步:先产生一个和原先一样的临时对象
第二步:临时量调用swap()函数两者进行交换。
第三步:语句结束,临时量自动析构。
*/
{
std::vector<int> tmp = vec;
vec.swap(tmp);
}
cout<<"size="<<vec.size()<<endl;//0
cout<<"capacity="<<vec.capacity()<<endl;//0
return 0;
}
输出:
size=1
capacity=1
size=2
capacity=2
size=3
capacity=4
size=4
capacity=4
size=5
capacity=8
---------------------------------------------
size=0
capacity=8
size=0
capacity=8
size=0
capacity=0
所以,回收vector空间有两种方法:
方法1:
vector<int>(vec).swap(vec); //等价于vec.swap(vector<int>())
方法2:
{
std::vector<int> tmp = vec;
vec.swap(tmp);
}
使用clear()和erase()两个函数只是清空元素,但不回收内存。
先使用clear()再使用swap(),释放空间并且回收内存。