vector删除元素与清除内存空洞
问题:stl中的vector容器经常造成删除假象,这对于c++程序猿来说是极其讨厌的,《effective stl》大师已经将之列为第17条,使用交换技巧来修整过剩容量。
内存空洞这个名词是网上的学者给出的。我认为用来描写叙述这个基本现象特别easy提醒自己vector删除的这个陷阱。
首先给出一段代码:
35 void testvector()
36 {
38 vector v;
39 v.push_back(1);
40 v.push_back(2);
41 cout << "v size = " << v.size() << " v capacity = " << v.capacity() << endl;
42 v.erase(v.begin());
43 cout << "v size = " << v.size() << " v capacity = " << v.capacity() << endl;
44 vector(v).swap(v); // 清除v并且最小化它的容量
45 cout << "v size = " << v.size() << " v capacity = " << v.capacity() << endl;
47 }
结果例如以下:
[hfx@didkey1 bin]$ ./test
v size = 2 v capacity = 2
v size = 1 v capacity = 2
v size = 1 v capacity = 1
分析:
能够清楚地看到这个问题,在第一次 v.erase(v.begin());的时候,并没有真正释放删除元素的内存,它的容量还是存着。
我也简单描画下这个生活中的问题——
你拿这一个1000升的水去沙漠上旅行,開始是满的。可是,你的旅途让你的水变成了1升。并且路途中,你没有水资源让你再次灌满,那么。你一直将拖着一个1000升
容量的大水箱,载着1升水在旅行,你是不同意自己这样做的。你仅仅有把这个水箱切了。切成10升或者1升,小点……
vector也一样,你把水喝了。并不能把水箱也缩小,要把水箱缩小的做法——
——swap()交换函数完美释放内存。
vector(v).swap(v); // 清除v并且最小化它的容量
注意:
a. erase()函数。仅仅能删除内容,不能改变容量大小;
erase成员函数,它删除了itVect迭代器指向的元素,而且返回要被删除的itVect之后的迭代器,迭代器相当于一个智能指针。
b. clear()函数,仅仅能清空内容,不能改变容量大小
c. vector容器删除不自己主动释放内存。那么它存在内存泄露???不是的。vector在析构函数的时候。对内存进行了释放。
d. 假设要想在删除内容的同一时候释放内存,那么你能够选择deque容器。
e. 关于vector:
vector相当于c++中的数组,数组在初始化的时候也须要给它一个数组空间大小,vector申请的时候将预留一个空间,比方10。在元素超过10的时候,vector自己主动将大小
扩大到两倍。而且将元素拷贝过去。
使用方法举例:
vector(v).swap(v);将v的内存空洞清除
vector().swap(v);清空vec
vector删除元素与清除内存空洞的更多相关文章
- PAT Advanced 1009 Product of Polynomials (25 分)(vector删除元素用的是erase)
This time, you are supposed to find A×B where A and B are two polynomials. Input Specification: Each ...
- vector删除元素浅析
<<effectSTL>>书中提到erase-remove方法 即c.rease(remove(c.begin(),c.end(),1963),c.end()) 关于remo ...
- vector容器删除某些元素且释放内存
1,size和capacity size: 指目前容器中实际有多少元素,对应的resize(size_type)会在容器尾添加或删除一些元素,来调整容器中实际的内容,使容器达到指定的大小. capac ...
- 完美删除vector的内容与释放内存
问题:stl中的vector容器常常造成删除假象,这对于c++程序员来说是极其讨厌的,<effective stl>大师已经将之列为第17条,使用交换技巧来修整过剩容量.内存空洞这个名词是 ...
- C++之vector中元素删除
今天在删除vector中的元素中遇到一个问题,这里记录下来以便以后查阅. 预备知识:用到了erase()函数,对于一个容器c来说,假设迭代器为p,那么执行: c.erase(p)之后就删除了容器c中p ...
- C++ vector 删除一个指定元素 和 find 一个指定元素以及遍历删除、 map遍历删除元素和删除find到的元素
vector: 1.delete element 转载:http://www.cnblogs.com/xudong-bupt/p/3522457.html #include <vector> ...
- C++ vector 删除符合条件的元素
C++ vector中实际删除元素使用的是容器vecrot中std::vector::erase()方法. C++ 中std::remove()并不删除元素,因为容器的size()没有变化,只是元素的 ...
- vector容器中添加和删除元素
添加元素: 方法一: insert() 插入元素到Vector中 iterator insert( iterator loc, const TYPE &val ); //在指定位置loc前插入 ...
- C++ vector清空元素的三种方法
#include <iostream> #include <vector> using namespace std; //STL vector的几种清空容器(删除)办法 voi ...
随机推荐
- Js的闭包,这篇写的是比较清晰明了的
一.变量的作用域 要理解闭包,首先必须理解Javascript特殊的变量作用域. 变量的作用域无非就是两种:全局变量和局部变量. Javascript语言的特殊之处,就在于函数内部可以直接读取全局变量 ...
- 关于隐藏元素高度的问题 css visibility:hidden 与 display:none的区别
其实这是一个老问题了,s visibility:hidden 与 display:none 共同点就是都会似的元素不可见.但是 visibility:hidden 的DOM元素是占用空间的,会挤占其他 ...
- transition过度
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- java Log4j日志配置详解大全
一.Log4j简介 Log4j有三个主要的组件:Loggers(记录器),Appenders (输出源)和Layouts(布局).这里可简单理解为日志类别,日志要输出的地方和日志以何种形式输出.综合使 ...
- 重写Fields 控制models 数据输出字段
models: public function Fields() { $fields = parent::Fields();//原来models输出字段 $fields['parentComment' ...
- 为Go程序创建最小的Docker Image
本文将会介绍如何使用docker打包一个golang编写的应用程序,最终的产物就是一个makefile文件,可别小瞧这短短几行代码,涉及的知识点可不少,接下来我们就仔细剖析一下吧. FROM gola ...
- MySql的虚拟机和Xshell5的连接过程
给大家介绍一下虚拟机和Xshell5连接的基本配置1.安装虚拟机,跟着提示一步一步安装即可,注意添加镜像文件,虚拟机就完成了.2.下载一个Xshell5,安装好之后.要修改虚拟机的网卡状态 1) ...
- Hue 之 SparkSql interpreters的配置及使用
1.环境说明: HDP 2.4 V3 sandbox hue 4.0.0 2.hue 4.0.0 编译及安装 地址:https://github.com/cloudera/hue/releases/t ...
- Vim常用操作-合并行。
刚接触 Vim 会觉得它的学习曲线非常陡峭,要记住很多命令.所以这个系列的分享,不会教你怎么配置它,而是教你怎么快速的使用它. 在开发时为了代码美观,经常会把属性用换行的方式显示. <el-di ...
- 关于tolua的使用
一.首先在引擎的跟目录下找到cocos2d-x自带的工具tolua++ 二.使用tolua++生成自定义类的声明 打开tool文件夹中的readme文件如下: 1. Generating the lu ...