您的位置:首页 > Web前端

effective stl 第17条: 使用“swap 技巧”除去多余的容量

2016-09-10 19:57 381 查看
#include<iostream>
#include<vector>
#include<string>
#include<set>

using namespace std;

class people
{
public:
people();
~people();

private:

};

people::people()
{
}

people::~people()
{
}

int main()
{
/*
本次主要讨论的是如何消除有很大容量,但是只有很少元素的情况
假设某次比赛报名人数很多,都放在p容器中,但是经过筛选可能淘汰很多的人,可能使用erase或者其它的方法
结果缩减了该向量的size()即大小,但是capacity()容量的大小却没有变换
*/
vector<people> p;
//使用下边的做法可以消除p中多余的容量
//原因如下:
//表达式vector<people>(p)创建了一个临时的向量,他是p的拷贝,然而vector的拷贝构造函数只为所拷贝的元素分配内存
//所以该临时变量没有多余的容量,所以交换之后刚刚好
//在语句的结尾,临时变量被析构,从而释放了先前p的内存,完美
vector<people>(p).swap(p);

//同样的技巧对string也适用,现在解释()是什么意思,假设新建一个变量则是string s=new string(a);现在没有新建变量,而是直接
//使用后半句,所以在语句结束的时候自动调用析构函数释放内存
string s;
//....
string(s).swap(s);

/*
这种技术并不一定能保证去除多余的容量,因为STL设计者可能愿意为vector和string 保存多余的容量,他们可能需要一个最小的容量,
或者把vector和string的容量限制为2的乘幂数

简单来说,即这种方法是使得“容量尽量小”,即在容器当前的大小确定的情况下,使容量在该实现下变得最小
*/

//swap的另一个技巧是清楚一个容器,并使得其容量变为该实现下的最小值

vector<people> vp;
string ss;

//经过一系列的操作之后
vector<people>().swap(vp);
string().swap(ss);

//在做swap交换时,不仅两个容器的内容被交换,同时他们的迭代器、指针和引用也将被交换
//在swap发生之后,原本指向某容器中的迭代器、指针和引用依然有效,并指向相同的元素,只是这些元素在另一个容器中了

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息