使用vector的成员函数swap()重置vector的capacity(容量)

/*      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;
 }