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 ...
随机推荐
- selenium+testN自动化测试框架搭建
自动化测试框架搭建 1 Java环境的搭建 1.1访问oracle的官网下载最新版本的jdk http://www.oracle.com/technetwork/java/javase/downloa ...
- Cordova使用build命令出错: Could not create the Java Virtual Machine.
这是因为虚拟机内存不足导致的,解决方案如下: _JAVA_OPTIONS=-Xmx512M
- c#把汉字转化成全拼音函数(全拼)
/// <summary> /// 把汉字转换成拼音(全拼) /// </summary> /// <param name=&q ...
- linux 内存 大于 jvm xmx
文章来源: http://www.cnblogs.com/guozp/p/7845605.html 1.虽然你jvm参数设置了-Xms6g -Xmx6g,但操作系统不并会马上分配6G的物理内存,而是确 ...
- StackExchange.Redis学习笔记(四) 事务控制和Batch批量操作
Redis事物 Redis命令实现事务 Redis的事物包含在multi和exec(执行)或者discard(回滚)命令中 和sql事务不同的是,Redis调用Exec只是将所有的命令变成一个单元一起 ...
- Java Web基础入门
前言 语言都是相通的,只要搞清楚概念后就可以编写代码了.而概念是需要学习成本的. Java基础 不用看<编程思想>,基础语法看 http://www.runoob.com/java/jav ...
- ligerUI---ListBox(列表框可移动)
写在前面: 对于可移动的列表框,ligerui中也对其进行了封装,可以直接照着demo拿来用,不过那都是直接在页面上静态初始化的数据,那么如何从后台获取? 前面有了对ligerui的一些组件的使用经验 ...
- ASP.NET中HttpContext.Cache的使用
-------------------------------键 --值-----依赖-----过期时间-------------------------------绝对过期------------- ...
- Python函数篇
1.函数名的命名规则: 函数名必须以下划线或字母开头,可以包含任意字母.数字或下划线的组合.不能使用任何的标点符号: 函数名是区分大小写的. 函数名不能是保留字. 2. 形参和实参 形参:形式参数,不 ...
- VS2015远程调试
原文链接 VS2015远程调试 在PayPal支付时,PayPal回调函数一直报错,本地没有外网IP,没有办法在本地调试,需要远程调试: 1.找到远程调试的文件夹: 找到对应的服务器的型号:64位 ...