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