STL vector中的元素删除
2016-03-06 18:34
671 查看
删除vector中的元素,最容易的方法就是使用vector的erase()函数。
如果要清空vector中的元素,可以使用erase()循环删除,也可以用clear()函数。
需要注意,如果vector中存储的元素是指针,那么erase()或者clear()并不会删除指针指向的对象或者内存空间,要小心内存泄漏问题。
原来这样的问题在 《Effective STL》中的“条款17”已经指出了
当vector、string大量插入数据后,即使删除了大量数据(或者全部都删除,即clear) 并没有改变容器的容量(capacity),所以仍然会占用着内存。 为了避免这种情况,我们应该想办法改变容器的容量使之尽可能小的符合当前 数据所需(shrink to fit)
也就是说,erase()函数虽然会删除指定位置的元素,但是元素所占用的内存空间并不会被释放掉,也就是说,被删除的元素所占的内存空间还是被vector占有的,而没有被系统回收。
要解决这个问题可以使用vector中的swap()函数。
《Effective STL》给出的解决方案是:
vector<type> v;
//.... 这里添加许多元素给v
//.... 这里删除v中的许多元素
vector<type>(v).swap(v);
//此时v的容量已经尽可能的符合其当前包含的元素数量
//对于string则可能像下面这样
string(s).swap(s);
假设vector vec起初有1000个元素,后来删掉500个,那么要释放掉那500个int所占的空间,可以这样:
vector vec; for ( vector::iterator iter = vec.begin(); iter! = vec.end();) { if(某条件成立) iter = vec.erase(iter); else iter ++; }
如果要清空vector中的元素,可以使用erase()循环删除,也可以用clear()函数。
for ( vector::iterator iter = vec.begin(); iter! = vec.end();) { iter = vec.erase(iter); } //或者直接clear vec.clear();
需要注意,如果vector中存储的元素是指针,那么erase()或者clear()并不会删除指针指向的对象或者内存空间,要小心内存泄漏问题。
原来这样的问题在 《Effective STL》中的“条款17”已经指出了
当vector、string大量插入数据后,即使删除了大量数据(或者全部都删除,即clear) 并没有改变容器的容量(capacity),所以仍然会占用着内存。 为了避免这种情况,我们应该想办法改变容器的容量使之尽可能小的符合当前 数据所需(shrink to fit)
也就是说,erase()函数虽然会删除指定位置的元素,但是元素所占用的内存空间并不会被释放掉,也就是说,被删除的元素所占的内存空间还是被vector占有的,而没有被系统回收。
要解决这个问题可以使用vector中的swap()函数。
《Effective STL》给出的解决方案是:
vector<type> v;
//.... 这里添加许多元素给v
//.... 这里删除v中的许多元素
vector<type>(v).swap(v);
//此时v的容量已经尽可能的符合其当前包含的元素数量
//对于string则可能像下面这样
string(s).swap(s);
假设vector vec起初有1000个元素,后来删掉500个,那么要释放掉那500个int所占的空间,可以这样:
std::vector(vec).swap(vec); //上面这行代码相当于下面两行 //即先产生一个跟vec中现有内容相同且占用空间刚好满足其大小的vector tmp //然后把tmp与vec对换 //当出了tmp的作用域(例如下面的一对大括号)后,tmp所占的空间就被释放掉了 { std::vector tmp(vec); tmp.swap(vec); }
相关文章推荐
- View的四种动画,
- 《JavaScript权威指南(第六版)》知识点总结(二)
- bzoj 3110 [Zjoi2013]K大数查询(树套树)
- [HTML5] Level up -- Display
- Linux 2.6.19.x 内核编译配置选项简介(四)
- 【杭电-oj】-2013-蟠桃记
- java 整合 Redis
- POJ-1936- All in All( 最长公共子序列 && 水题 )
- 【线段树】学习笔记
- blade and soul zone overview
- Android开发之Animation介绍(下) ——Property Animation
- C++对lua静态库的使用
- Linux 2.6.19.x 内核编译配置选项简介(三)
- 跨平台C、C++代码注意的事项及如何编写跨平台的C/C++代码
- 虚幻4 配置打包安卓
- CSS学习(八)-background-origin、background-clip
- 折半查找法/C语言版
- Spring MVC 环境搭建(二)
- CI和CD的意思
- linux libjpeg对图像进行压缩