STL容器之 元素删除
来源:互联网 发布:中位数快速选择算法 编辑:程序博客网 时间:2024/05/17 03:37
stl容器的元素删除跟具体的按内存分配方式关系密切。按内存分配方式可以分为节点内存容器和连续内存容器、节点内存和连续内存混合容器。
节点内存容器指的是一种表现方式,包括list、slist等这样基于节点的容器(链表实现)和set、map、multiset、multimap等关联容器(平衡树实现)
连续内存容器指的是在一块连续的内存上保存元素的连续内存容器,比如vector,string等。
节点内存和连续内存混合容器是指部分内存连续保存,连续的内存又作为节点以平衡树保存,如deque等。
1、节点内存容器
以list为例,当调用erase函数之后,被删除的元素的迭代器将会失效,则需要在删除之前移动迭代器,并传入原来迭代器的拷贝作为erase函数的参数。
方式一:
使用后置++函数,代码如下:
list<int>::iterator it; for (it = lt.begin(); it != lt.end(); ) { if (*it % 2 == 0) lt.erase(it++); //后置++操作符函数返回的是移动前的迭代器的拷贝 else ++it; }
方式二:
使用链表容器使用erase删除节点将会返回下一个元素的地址,代码如下:
list<int>::iterator it; for (it = lt.begin(); it != lt.end(); ) { if (*it % 2 == 0) it = lt.erase(it);//自动返回下一个元素的地址,不用再主动前移指针 else ++it; }
map\multimap、set\multiset只能使用方式二来删除,其erase函数不会返回下一个有效迭代器。
2、连续内存容器
以vector为例
方式一:
当调用erase函数时,迭代器指向的元素被删除了,但是被删元素后面所有的元素会被前移(具体参考STL源码), 因此迭代器会自动指向下一个元素。
vector<int>::iterator it = v.begin(); for (it = v.begin(); it != v.end(); ) { if (*it % 2 == 0) v.erase(it);//删除元素后,后面元素自动往前移,不用移动迭代器 else ++it; }
方式二:
当调用erase函数时,迭代器指向的元素被删除了,erase函数返回下一个元素的有效迭代器。
vector<int>::iterator it; for (it = lt.begin(); it != lt.end(); ) { if (*it % 2 == 0) it = lt.erase(it);//自动返回下一个元素的地址 else ++it; }
3、节点内存和连续内存混合容器
以deque为例,当调用erase后,原来删除的迭代器有可能失效了,erase函数返回下一个元素的迭代器。
deque<int>::iterator it; for (it = lt.begin(); it != lt.end(); ) { if (*it % 2 == 0) it = lt.erase(it);//自动返回下一个元素的地址,不用再主动前移指针 else ++it; }
需要注意的是deque删除迭代器不能使用后置++函数的方式来获取下一个有效迭代器,因为它的内存分配是节点内存和连续内存混合的。
0 0
- STL容器之 元素删除
- STL容器之删除元素,迭代器失效
- STL容器之删除元素,迭代器失效
- STL容器元素的删除
- stl容器遍历删除元素
- 安全删除STL容器元素
- STL之容器:选择时机,删除元素,迭代器失效
- STL之容器:选择时机,删除元素,迭代器失效
- STL之容器:选择时机,删除元素,迭代器失效
- STL之容器:选择时机,删除元素,迭代器失效
- STL 之容器:选择时机,删除元素,迭代器失效
- STL 4: STL之容器:选择时机,删除元素,迭代器失效
- <Effectives STL>笔记之在STL容器中删除元素的方法选择
- 怎样删除STL容器中的元素
- STL容器删除元素的陷阱(转)
- STL容器删除元素的陷阱
- STL容器的删除元素问题
- 删除STL容器元素的方法
- 解决 emulator-5554 disconnected !Cancelling错误
- java.jse--在java中调用python方法
- nginx简单配置动静分离
- sql查询记录行转列
- iOS 关于Blocks
- STL容器之 元素删除
- Mybatis1.2.2与spring4.1.6整合(附源码下载)
- Andrew NG 机器学习课程笔记(二)
- rsync 同步访问方向问题
- vim自动添加文件注释
- 【main()的参数探究】
- yahoo和google的搜索结果简单分析记录
- 海岛奇兵单机模式攻略(图文)
- 设计模式之装饰模式(Decorator)