为了避免vector占用不再需要的内存,需要有一种方法把它的容量(capacity)缩减到当前需要的数量。方法就是:vector<ElemType>(v).swap(v);。

vector<ElemType>(v)创建一个临时变量,它是v的一个拷贝。vector的拷贝构造函数只为所拷贝的元素分配所需要的内存,所以这个临时变量不会有多余的容量。然后将这个临时变量与v做swap操作,在这之后v就具有了被去除之后的容量,即原先临时变量的容量。临时变量会具有原先v的容量,随后临时变量被析构,从而释放内存。

测试程序及输出(vc2008):

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:
100
10
0

同样的技巧对string也适用:string(s).swap(s);。

需要注意:这一技术并不保证去除全部多余的容量。STL的实现者可能会为vector和string保存一定的多余的容量。所以这种“swap技巧”实际上意味着“在容器当前的大小确定的情况下,使容量在该实现下变为最小”。

对于swap操作,需要注意:不仅两个容器的内容会被交换,同时它们的迭代器、指针和引用也将被交换(string除外)。在swap之后,原先指向容器中元素的迭代器、指针和引用依然有效,并指向同样的元素——但这些元素已经在另一个容器中了。

转载于:https://www.cnblogs.com/zhuyf87/archive/2012/12/06/2805318.html

使用“swap技巧”除去多余的容量相关推荐

  1. 删除桌面计算机,电脑设置小技巧(多余壁纸、屏保删除方法)

    1.电脑桌面壁纸的删除方法 XP系统进入C:\WINDOWS\Web\Wallpaper...把里面不要的图片删除,就行了. 右键点击桌面-属性-背景-点你不要的那个背景壁纸-点击浏览(可以看见你不要 ...

  2. 根据html除去多余css样式在线,利用css-redundancy-checker去除冗余、无用、废弃的css样式代码...

    背景 为网站写CSS样式的时候,经常会遇到CSS样式的修改或者网页设计的改变,而这些网页在经过无数次的修改之后,可能有些样式已经用不到了,css文件中可能存在着一些没用的CSS代码.这些无用的CSS代 ...

  3. Effective STL 50条有效使用STL的经验笔记

    Scott Meyers大师Effective三部曲:Effective C++.More Effective C++.Effective STL,这三本书出版已很多年,后来又出版了Effective ...

  4. 【C++】Effective STL:50条有效使用STL的经验

    第一条:慎重选择容器类型 1.C++容器:先混个眼熟 序列容器:array.vector.string.deque.list.forward_list 有序关联容器:set.map.multiset. ...

  5. C++ 容器及选用总结

    原文地址 目录 ==================================================== 第一章 容器 第二章 Vector和string 第三章 关联容器 第四章 迭 ...

  6. ###《Effective STL》--Chapter2

    点击查看Evernote原文. #@author: gr #@date: 2014-09-15 #@email: forgerui@gmail.com Chapter2 vector和string T ...

  7. 《Effective STL》条款解读

    条款01:慎重选择容器类型 vector.list和deque有着不同的复杂度,vector是默认使用的序列类型.当需要频繁在序列中间做插入和删除操作时,应使用list.当大多数插入和删除操作发生在序 ...

  8. Effective STL中文版:50条有效使用STL的经验(双色)

    <Effective STL中文版:50条有效使用STL的经验(双色)> 基本信息 作者: (美)梅耶(Meyers,S.) 译者: 潘爱民 陈铭 邹开红 出版社:电子工业出版社 ISBN ...

  9. Effective STL读书笔记

    第一章容器 条款1:仔细选择你的容器 C++中各种标准或非标容器: 标准STL序列容器:    vector.string.deque和list(双向列表). 标准STL管理容器:    set.mu ...

最新文章

  1. 图像修复中的TV模型
  2. CSUOJ 1525 Algebraic Teamwork
  3. findContours函数
  4. 数据中心管理将成为未来十年所需的技能
  5. 区块链BaaS云服务(12)易居(中国) 房地产 EBaaS(Estate Blockchain as a Service)
  6. Material Master_物料类型后台配置
  7. 前端 datatable 居中_Midway Serverless 如何让阿里前端提效 50%?
  8. java面试要点---oracle,mysql,DB2数据库的分页
  9. python修改wav文件声音大小_Python更改wav文件的音高
  10. Win10系统U盘启动盘制作详解
  11. html 图层嵌套特点,ps图层有哪几种类型?
  12. Davinci BI报表工具~
  13. 【网络安全】威胁情报信息
  14. 《数学之美》第一章读后感
  15. Android实现简单的网页跳转
  16. 【SGU】117. Counting 快速幂
  17. 洋码头 根据关键词取商品列表 API
  18. python办公自动化pdf下载,你们都用Python实现了哪些办公自动化?
  19. 光宇游戏软件测试面试,新闻中心
  20. CSS组件之图形(figure)

热门文章

  1. 在不推动提交的情况下触发Travis-CI重建?
  2. 如何在python中识别未知的日期时区时区
  3. win11如何执行干净启动 windows11执行干净启动的设置方法
  4. slam无人车清除地图残影
  5. urtlebot3启动键盘控制后 /cmd_vel 会持续输出数据,在键盘不给信号时 /cmd_vel 续输,导致此功能与导航同时启动,会导致小车自动行走时一顿一顿的
  6. C语言随笔小算法:单项链表如何实现队列
  7. 路径规划之图规划算法(图片版)
  8. 手机模板区块(HTML、CSS)
  9. 新增的表单元素 结构伪类选择器
  10. zlib 加密 java_JAVA自带Zlib+base64位压缩加密和解压解密