首页 > 代码库 > map erase iterator
map erase iterator
错误写法:
map<int, int> m;for (map<int, int>::iterator it = m.begin(); it != m.end(); it++){ m.erase(it); }
这样会导致程序行为不可知。因为map是关联容器,对于关联容器来说,如果某一个元素已经被删除,那么其对应的迭代器就失效了,不应该再被使用;否则会导致程序无定义的行为。
正确写法1(STL推荐写法):
map<int, int> m;for (map<int, int>::iterator it = m.begin(); it != m.end(); ){ m.erase(it++); }
使用删除之前的迭代器定位下一个元素。逻辑上来说是在for里做++和m.erase(it++)是一样的,但可能是与编译器的编译方式有关。编译器可以识别erase(it++)这样的操作并做相应优化避免不可知行为。
正确写法2:
map<int, int> m;for (map<int, int>::iterator it = m.begin(); it != m.end(); ){ it = m.erase(it); }
erase()函数返回下一个元素的迭代器。
map erase iterator
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。