删除文章

确定要删除这篇文章吗?

取消
确定

STL容器循环erase迭代器失效

     阅读(299)  2018-12-20 09:42:21

STL容器循环erase迭代器失效

下面以std::map作为例子其他容器类似,给出两种写法一种C++11的一种C++03的

    // 初始化
    std::map<int, int> mp;
    for (int i = 0; i < 10; i++) {
        mp[i + 1] = i + 1;
    }
    
    // 删除value为偶数的
    // C++11
    {
        auto iter = mp.begin();
        while (iter != mp.end()) {
            if (iter->second % 2 == 0) {
                iter = mp.erase(iter);
            } else {
                ++iter;
            }
        }
    }

    // C++03
    {
        std::map<int, int>::iterator iter = mp.begin();
        while (iter != mp.end()) {
            if (iter->second % 2 == 0) {
                mp.erase(iter++); // iter++,iter先++再返回先前的iter
            } else {
                ++iter;
            }
        }
    }

    // 打印结果
    {
        std::map<int, int>::iterator iter = mp.begin();
        for (; iter != mp.end(); ++iter) {
            std::cout << iter->second << std::endl;
        }
    }

C++03这种写法成立的原因是erase(iter++)迭代器失效之前iter已经++,erase其实使用的是之前的迭代器,所以下面这种写法是错误的会造成崩溃

mp.erase(iter);
iter++; // 此时迭代器已经失效

c++11的这种写法在某些linux编译器上不支持

文章评论

Keep it simple,stupid
文章数
296
总访问量
400377
今日访问
437
最近评论

xuehaoyun : 很不错,来围观一下
tujiaw : 抱歉csdn code服务关闭了,这个代码我也找不到了
于淞 : 你好,这个文章的源码能分享一下吗,songsong9181@163.com,谢谢了 上面的写错了
于淞 : 你好,这个文章的源码能分享一下吗,838106303@163.com,谢谢了 上面的链接不能用了
tujiaw : 多谢多谢
essaypinglun college-paper.org : 很好的博客,赞赞
Folly : 这个实现有点奇怪,Qt为什么没有统一的比对方法。
过多s : alert("hello, world!")
tujiaw : 还不错哦
回到顶部