STL中erase()小心使用 http://blog.csdn.net/yangruibao/article/details/9040045
来源:互联网 发布:网络电玩数据修改 编辑:程序博客网 时间:2024/05/18 03:53
http://blog.sina.com.cn/s/blog_67b6b720010114d3.html
erase()函数的功能是用来删除容器中的元素
删除某个容器里的某个元素:c.erase(T);
看似一个简单的动作,然而对不同类型的容器,内部却做了截然不同的事情,后面介绍。
假设有这样一个题目,将某个容器中所有满足条件N == X的元素删除,按照常规的思路应该有类似这样的代码:
//
Container<T>::iterator
}
然而这样的代码对于任一种容器都是错误的
容器按内存分配方式可以分为链表容器和数组容器。
所谓的链表容器指的是一种表现方式,包括list、slist等这样基于节点的容器(动态分配内存块)和set、map、multiset、multimap等关联容器(平衡树实现),而数组容器指的是在一块连续的内存上保存元素的连续内存容器,比如vector、deque、string等。
链表容器以list为例,当执行container.erase(it)时,确实第一个满足条件的元素删除了,但这时it指针已经被删除了,它也不指向任何元素了,所以也只能到此为止了,也就是说上面的代码对于链表容器来说只能正确删除第一个满足条件的元素,针对这个问题我们首先想到的就是在删除指针之前,给其做个备份。
将这个临时变量直接建立在erase实现里,这样做更简洁,也显得专业些。
list<int>::iterator
链表容器使用erase删除节点还有一个特点,就是会将下一个元素的地址返回,所以也可以这样实现:
list<int>::iterator
数组容器以vector为例,当执行container.erase(it)时,和上面提到的一样,第一个满足条件的元素删除了,但这时数组容器不允许中间有“空隙”,所以会做个大动作,就是将被删元素后面所有的元素前移(参考STL源码),而数组容器记录的是下标,所以删除元素后,当前下标定位的元素也就顺理成章的变成了原有队列中的下一个元素,同样以删除偶数为例,代码如下:
vector<int>::iterator
vector erase iterator outside range
- STL中erase()小心使用 http://blog.csdn.net/yangruibao/article/details/9040045
- C++中STL迭代器的种类和简介http://blog.csdn.net/woshifeixingzhuiyue/article/details/7376308
- vector 的删除操作pop_back、erase效率对比 http://blog.csdn.net/efeics/article/details/8059690
- selenium使用中遇到的问题,转自:http://blog.csdn.net/funi16/article/details/9036753
- C++中智能指针的设计和使用 http://blog.csdn.net/hackbuteer1/article/details/7561235
- 使用stl中的 advance和 distance 方法来进行iterator的加减 http://blog.csdn.net/tangaowen/article/details/7515558
- STL编程轻松入门(lwbeyond:http://blog.csdn.net/lwbeyond/article/details/5940743)
- C++ STL学习之stack。http://blog.csdn.net/wallwind/article/details/6858634
- STL中的模板类pair 和map http://blog.csdn.net/calvin_zcx/article/details/6072286
- STL关联容器概述 http://blog.csdn.net/yfkiss/article/details/6594859
- C++——STL所有算法介绍 http://blog.csdn.net/shinehoo/article/details/5736155
- STL 之随机访问迭代器 http://blog.csdn.net/tangaowen/article/details/7515558
- STL中的find_if函数 http://blog.csdn.net/hj490134273/article/details/6051080
- STL容器与拷贝构造函数 http://blog.csdn.net/heyutao007/article/details/6702626
- http://blog.csdn.net/IBM_hoojo/article/details/5688947
- http://blog.csdn.net/chenlaic/article/details/6143235
- http://blog.csdn.net/eaglewood2005/article/details/4335052
- http://blog.csdn.net/mchp/article/details/3995970
- 杭电5595 GTW likes math
- 广义表算法库
- 20151213_非创意_Application类
- huawei 动态库适配
- uva11205 -(简单题) 生成子集问题
- STL中erase()小心使用 http://blog.csdn.net/yangruibao/article/details/9040045
- Activity 之间的数据传递四种 (随记六)
- 黑马程序员——IO流学习笔记
- java中的集合之Set接口(三)
- CentOS 7 下使用 Firewall
- SIFT学习笔记之一 下载和调用
- 解决Andriod软键盘出现把原来的布局给顶上去的方法
- kmeans聚类的简介和代码(python)
- MVC5开发前端框架AngularJS快速入门之Service