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

#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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值