/* vector容器有size(元素个数)和capacity(容量)两个属性,这两个属性既有联系又有区别。对于size属性,我们可以通过成员函数size()获得,也可以很容易的通过成员函数resize()进行重置。而capacity不是这样,我们可以通过成员函数capacity()获得容量值,但没有重置容量的成员函数。这种情况会导致,当我们使用某vector对象处理完大容量数据后,还想接着用其处理小容量数据,使用resize()重置后,size(元素个数)变小了,但用调用capacity()查看,capacity(容量)仍然很大,会占用很多内存。怎样将capacity(容量)变得和size(元素个数)一样大小哪?这里介绍一个使用vector成员函数swap()重置capaicity(容量)的方法。为便于理解,我们将整个分析过程写成一个小程序。
*/
//具体代码如下:
#include<iostream>
using namespace std;
#include<vector>
#include<algorithm> //使用for_each()需要包含
//显示函数
//void myPrint(int val)
//{cout<<val<<" ";}
//写一个仿函数作为参数用于for_each()显示vector元素
class myPrint
{public:
void operator() (int val) { cout << val << endl; }
};
//主函数
int main()
{
//声明一个vector对象vec并压入10000个元素
vector<int> vec;
for(int i=1;i<10000;i++)
{
vec.push_back(i);
}
//显示vec的size(元素个数)和capacity(容量)
cout<<"size重置前vec.size="<<vec.size()<<endl; //显示结果是: 9999
cout<<"size重置前vec.capacity="<<vec.capacity()<<endl; //显示结果12138
cout<<"-------------------------------------"<<endl;
//对vector的size重置为5,然后显示重置后的size和capacity
vec.resize(5);
cout<<"重置后vec.size="<<vec.size()<<endl; //显示结果5
cout << "重置后vec内的元素:" << endl;
for_each(vec.begin(),vec.end(),myPrint()); //显示结果: 1、2、3、4、5
//由于size进行了重置,虽开始压入10000个数但只显示5个
cout<<"重置size后vec.capacity="<<vec.capacity()<<endl; //显示结果: 12138 (通10000个元素时一样)
cout<<"------------------------------------"<<endl;
//使用vector成员函数swap()重置capacity(容量)
vector<int>(vec).swap(vec);
/*可以发现再上面语句中,在<int>和(vec)之间没有对象名,这种方式声明的是匿名对象,第一个()中的vec
表示调用构造函数用vec对匿名对象初始化,由于此时v的size只有5个,那么生成的匿名对象的capacity也
是5,后边匿名对象的成员函数swap(vec)中的vec表示将匿名对象与vec进行交换,这样vec的capacity(容
量)也巧妙地变成了5。使用匿名对象的好处是交换完成后,我们不需要做什么,匿名对象的析构函数会自动
释放占用的内存。*/
cout<<"使用swap后vec.size="<<vec.size()<<endl; //显示结果: vec.size=5
cout<<"使用swap后vec.capacity="<<vec.capacity()<<endl; //结果v.capacity=5
cout<<"-----------------------------------"<<endl;
system("pause");
return 0;
}