使用swap技巧除去多余的容量
2015-10-13 14:15
246 查看
一、为了避免vector占用不再需要的内存,需要有一种方法把它的容量(capacity)缩减到当前需要的数量。方法就是:
vector(v)创建一个临时变量,它是v的一个拷贝。vector的拷贝构造函数只为所拷贝的元素分配所需要的内存,所以这个临时变量不会有多余的容量。然后将这个临时变量与v做swap操作,在这之后v就具有了被去除之后的容量,即原先临时变量的容量。临时变量会具有原先v的容量,随后临时变量被析构,从而释放内存。
同样的技巧对string也适用:string(s).swap(s);
需要注意:这一技术并不保证去除全部多余的容量。STL的实现者可能会为vector和string保存一定的多余的容量。所以这种“swap技巧”实际上意味着“在容器当前的大小确定的情况下,使容量在该实现下变为最小”。
二、另外,swap技巧的一种变换形式可以用来清楚一个容器,使其容器变为该实现下的最小值,只要与一个用默认构造函数创建的vector或string做交换就可以了:
三、对于swap操作,需要注意:不仅两个容器的内容会被交换,同时它们的迭代器、指针和引用也将被交换(string除外)。在swap之后,原先指向容器中元素的迭代器、指针和引用依然有效,并指向同样的元素——但这些元素已经在另一个容器中了。
参考:Effective Stl
vector<ElemType>(v).swap(v);
vector(v)创建一个临时变量,它是v的一个拷贝。vector的拷贝构造函数只为所拷贝的元素分配所需要的内存,所以这个临时变量不会有多余的容量。然后将这个临时变量与v做swap操作,在这之后v就具有了被去除之后的容量,即原先临时变量的容量。临时变量会具有原先v的容量,随后临时变量被析构,从而释放内存。
参考:http://www.cnblogs.com/zhuyf87/archive/2012/12/06/2805318.html vector<int> v; v.reserve(100); cout << v.capacity() << endl; for (int i = 0; i < 10; ++i) v.push_back(i); vector<int>(v).swap(v); cout << v.capacity() << endl; vector<int>().swap(v); cout << v.capacity() << endl; output: 10
同样的技巧对string也适用:string(s).swap(s);
需要注意:这一技术并不保证去除全部多余的容量。STL的实现者可能会为vector和string保存一定的多余的容量。所以这种“swap技巧”实际上意味着“在容器当前的大小确定的情况下,使容量在该实现下变为最小”。
二、另外,swap技巧的一种变换形式可以用来清楚一个容器,使其容器变为该实现下的最小值,只要与一个用默认构造函数创建的vector或string做交换就可以了:
vector<T> v; string s; ...... vector<T>().swap(v);//清除v并把它的容量变为最小 string().swap(s);//清除s并把它的容量变为最小
三、对于swap操作,需要注意:不仅两个容器的内容会被交换,同时它们的迭代器、指针和引用也将被交换(string除外)。在swap之后,原先指向容器中元素的迭代器、指针和引用依然有效,并指向同样的元素——但这些元素已经在另一个容器中了。
参考:Effective Stl
相关文章推荐
- Docker 记录
- redis-管道
- 数据绑定-2
- C++ BOOST库 条件变量[多线程通信]机制 简单介绍
- SIP 协议介绍
- Junit使用教程(2)
- Spark机器学习1
- struct和typedef struct的用法
- tableView footerView背景颜色
- LR杂记 - Linux的系统监控工具vmstat详细说明
- SharePoint Server 2013安装与配置
- SpringMVC整合WebSocket
- 欢迎使用CSDN-markdown编辑器
- 数据绑定-1
- C#接口实现方法实例分析
- 位运算学习
- 停车场
- django构建blog--建立数据库部分+admin部分(eclipse+pydev)
- asp.net5中用户认证与授权(2)
- 清理DB2的归档日志