码迷,mamicode.com
首页 > 其他好文 > 详细

map erase iterator

时间:2016-10-14 23:17:49      阅读:181      评论:0      收藏:0      [点我收藏+]

标签:

错误写法:

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

标签:

原文地址:http://www.cnblogs.com/argenbarbie/p/5962308.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!