问题: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删除元素与清除内存空洞的更多相关文章

  1. 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 ...

  2. vector删除元素浅析

    <<effectSTL>>书中提到erase-remove方法  即c.rease(remove(c.begin(),c.end(),1963),c.end()) 关于remo ...

  3. vector容器删除某些元素且释放内存

    1,size和capacity size: 指目前容器中实际有多少元素,对应的resize(size_type)会在容器尾添加或删除一些元素,来调整容器中实际的内容,使容器达到指定的大小. capac ...

  4. 完美删除vector的内容与释放内存

    问题:stl中的vector容器常常造成删除假象,这对于c++程序员来说是极其讨厌的,<effective stl>大师已经将之列为第17条,使用交换技巧来修整过剩容量.内存空洞这个名词是 ...

  5. C++之vector中元素删除

    今天在删除vector中的元素中遇到一个问题,这里记录下来以便以后查阅. 预备知识:用到了erase()函数,对于一个容器c来说,假设迭代器为p,那么执行: c.erase(p)之后就删除了容器c中p ...

  6. C++ vector 删除一个指定元素 和 find 一个指定元素以及遍历删除、 map遍历删除元素和删除find到的元素

    vector: 1.delete element 转载:http://www.cnblogs.com/xudong-bupt/p/3522457.html #include <vector> ...

  7. C++ vector 删除符合条件的元素

    C++ vector中实际删除元素使用的是容器vecrot中std::vector::erase()方法. C++ 中std::remove()并不删除元素,因为容器的size()没有变化,只是元素的 ...

  8. vector容器中添加和删除元素

    添加元素: 方法一: insert() 插入元素到Vector中 iterator insert( iterator loc, const TYPE &val ); //在指定位置loc前插入 ...

  9. C++ vector清空元素的三种方法

    #include <iostream> #include <vector> using namespace std; //STL vector的几种清空容器(删除)办法 voi ...

随机推荐

  1. mybatis映射异常

    今天写项目突然遇到了这么个问题:  nested exception is org.apache.ibatis.reflection.ReflectionException: There is no  ...

  2. 修改oracle服务器端字符集

    ----设置字符集步聚------- conn /as sysdba; shutdown immediate; startup mount; alter system enable restricte ...

  3. HDU3045 Picnic Cows (斜率DP优化)(数形结合)

    转自PomeCat: "DP的斜率优化--对不必要的状态量进行抛弃,对不优的状态量进行搁置,使得在常数时间内找到最优解成为可能.斜率优化依靠的是数形结合的思想,通过将每个阶段和状态的答案反映 ...

  4. 前端基于react,后端基于.net core2.0的开发之路(1) 介绍

    文章提纲目录 1.前端基于react,后端基于.net core2.0的开发之路(1) 介绍 2.前端基于react,后端基于.net core2.0的开发之路(2) 开发环境的配置,注意事项,后端数 ...

  5. .net表达式计算器(中缀表达式转后缀表达式,支持20多个数学函数,支持函数嵌套)

    最近在网上查了一下表达工计算器的类库,发现Java版本的有一个比较成熟的叫W3EVal,好像是一个IBM工程师写的,.net就很少了(可能是我了解不够多),但投机取巧的实现思路有很多,比如: (1)将 ...

  6. c++/cmake /Android NDK 动态链接库交叉编译笔记

    项目使用cmake管理,由于项目的需要,核心代码要求跨 Linux/Windows/Android 三平台.Windows和Linux都好说,但Android NDK费了一番功夫还是没有解决.临时的解 ...

  7. HTML基础--元素类型及类型转换

    元素类型及类型转换 一.XHTML元素分类 根据css显示分类,XHTML元素被分为三种类型:块状元素,内联元素,可变元素 1.块状元素(block element) 1)块状元素在网页中就是以块的形 ...

  8. Scratch——教小孩子学编码

    教小孩子学编码 http://scratch.mit.edu/ http://v.163.com/movie/2013/3/H/I/M92389L06_M9238GTHI.html

  9. Python 函数相关概念

    高阶函数  数学概念 y=g(f(x))  在数学和计算机科学中,高阶函数应当至少满足下面一个条件的函数   条件1. 接受一个或多个函数作为参数  条件2. 输出一个函数 举例: def count ...

  10. 宏WINAPI和几种调用约定

    在VC SDK的WinDef.h中,宏WINAPI被定义为__stdcall,这是C语言中一种调用约定,常用的还有__cdecl和__fastcall.这些调用约定会对我们的代码产生什么样的影响?让我 ...