欢迎访问Ningto's博客

Menu
  • 首页
  • 归档
  • 关于
  • 书签
  • 必应壁纸
  • IT聚合
  • 工具
    • 我的工具列表
    • 我的网盘
    • 必应每日壁纸API
    • Html转Markdown
    • 仙尘光标
Menu

STL容器循环erase迭代器失效

最后更新 2018-12-20 01:42:21   阅读量 1955

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编译器上不支持

(转载本站文章请注明作者和出处:泞途 - ningto.com)

下一篇 – qpid笔记
上一篇 – vi、vim常用功能键

  1. C/C++

toningto@outlook.com

标签云

Life Android Javascript Python Windows Product Go Tools Java MQ Qt Node.js Tips Shell Design MongoDB Others Mac Mobile React C/C++ Web Boost Linux IOS Bug Database

推广链接

【腾讯云】云产品限时秒杀,爆款1核2G云服务器,首年99元

多谢支持,用了好几年,服务很稳定支持多设备!

其他

文章RSS

Copyright © 2016 Welcome To Ningto Blog | 鄂ICP备17003086号-2