c++ vectot或map 遍历杉树符合某种规则的元素
来源:互联网 发布:塔罗牌占卜软件 编辑:程序博客网 时间:2024/05/16 12:38
转自:
http://www.cnblogs.com/dabaopku/p/3912662.html对于c++里面的容器, 我们可以使用iterator进行方便的遍历. 但是当我们通过iterator对vector/map等进行修改时, 我们就要小心了, 因为操作往往会导致iterator失效, 之后的行为都变得不可预知. 比如:
#include <iostream>
#include <vector>
using
namespace
std;
int
main()
{
vector<
int
> a = {12, 23, 34, 45, 56, 67, 78, 89};
for
(
auto
iter = a.begin(); iter != a.end(); ++iter) {
if
(*iter > 30) {
a.erase(iter);
}
}
for
(
const
auto
&element : a) {
cout<<element<<endl;
}
return
0;
}
输出:
12
23
45
67
89
plusplus的reference里对 std::vector::erase 的描述是:
Iterators, pointers and references pointing to position (or first) and beyond are invalidated, with all iterators, pointers and references to elements before position (or first) are guaranteed to keep referring to the same elements they were referring to before the call.
只有删除元素前面的iterator还保持有效, 之后的遍历行为不可预知.
解决方案
对于vector, erase会返回下一个iterator, 因此我们可以使用如下的方法:
#include <iostream>
#include <vector>
using
namespace
std;
int
main()
{
vector<
int
> a = {12, 23, 34, 45, 56, 67, 78, 89};
for
(
auto
iter = a.begin(); iter != a.end(); ++iter) {
if
(*iter > 30) {
a.erase(iter);
}
}
for
(
const
auto
&element : a) {
cout<<element<<endl;
}
return
0;
}
阅读全文
0 0
- c++ vectot或map 遍历杉树符合某种规则的元素
- 遍历符合某种链接地址的link数
- 如何在遍历list,vector,map时删除符合条件的元素
- 如何在遍历list,vector,map时删除符合条件的元素
- Map 遍历里面的元素
- Map 遍历里面的元素
- 【Linux C】遍历文件夹下的某种类型的文件
- list遍历的时候,删除某个符合条件的元素
- list遍历的时候,删除某个符合条件的元素
- map的四种遍历方式,map遍历元素
- 遍历list或map时删除元素(较巧妙)
- 列出C盘根目录下符合规则的所有文件
- java遍历Map所有的元素
- 遍历删除map中元素的方法
- c++ 遍历map的时候删除元素
- map的遍历及删除元素
- 码农小汪-Map遍历的时候删除元素
- mysql查询符合某种条件的语句是第几条
- Javascript(二)
- vue-cli安装出错
- 【EntityFramework 6.1.3】个人理解与问题记录(3)
- Android SDK版本号 与 API Level 对应关系
- Mybatis面试
- c++ vectot或map 遍历杉树符合某种规则的元素
- 进攻即是最好的防御!19个练习黑客技术的在线网站
- MySQL
- Unity包体大小优化
- Jackson进行JSON解析和序列化
- Spring 四种配置数据源
- Android 异步消息处理机制 让你深入理解 Looper、Handler、Message三者关系
- centos7安装nginx
- Linux打开、关闭防火墙,打开某端口的命令