STL中erase()用法陷阱
来源:互联网 发布:线切割3b五角星编程 编辑:程序博客网 时间:2024/05/22 16:17
删除某个容器里的某个元素: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
- STL中erase()用法陷阱
- 【STL string中erase用法】
- 【STL string中erase用法】
- STL erase陷阱
- STL容器中erase方法的不同陷阱
- STL中容器操作的迭代器失效-erase()函数陷阱
- 关于C++中STL的erase用法
- vector中erase陷阱
- STL的erase()陷阱-迭代器失效总结
- STL的erase()陷阱-迭代器失效总结
- STL容器erase的使用陷阱
- STL的erase()陷阱-迭代器失效总结
- STL 的 erase() 陷阱-迭代器失效总结
- STL的erase()陷阱-迭代器失效总结
- STL 的 erase( ) 陷阱-迭代器失效总结
- STL的erase()陷阱-迭代器失效总结
- STL的erase()陷阱-迭代器失效总结
- STL 的 erase() 陷阱-迭代器失效总结
- usb 端点解释
- 浅谈:Android下的external源代码目录
- hdu 3974 Assign the task
- 原生态Android操作介绍之一
- android中requestWindowFeature用法
- STL中erase()用法陷阱
- ZOJ1709 POJ1562 Oil Deposits,并查集
- ISE 约束文件的基本操作
- AXIS报文头SOAPHEADER认证
- 为 eclipse 的 hibernate 配置文件(*.hbm.xml)加上自动提示功能
- WKT字段解释
- 自动填写excel表格
- linux hibernate on swap file
- java之native及jni生成dll总结