• C++ STL遍历map的时候如何删除其中的element


    我们通过map的erase(iterator it)方法删除元素的时候,如果此时erase处于遍历map的代码中,那么调用erase就需要小心一些。因为erase会导致输入参数iterator变的无效,从而影响后续的it++遍历map的逻辑。

    简单做法是,先将要删除的it保存下来,然后将用于遍历map的it指向下一个位置,然后删除掉保存下来的it。如下面代码所示:

    #include <map>
    #include <iostream>
    using namespace std;

    int main()
    {
        map<intint> map1;
        map<intint>::iterator mapit;
        map<intint>::iterator saveit;

        map1[1] = 2;
        map1[2] = 3;
        map1[3] = 4;
        map1[4] = 5;

        mapit = map1.begin();
        while (mapit != map1.end()) {
            cout << "Element key: " << mapit->first << ", value: " << mapit->second << endl;
            if (mapit->first == 2) {
                saveit = mapit;
                mapit++;
                map1.erase(saveit);
                continue;
            }
            mapit++;
        }

        cout << "Map size: " << map1.size() << endl;
        return 0;
    }

    需要注意的是,这里windows的STL(windows C++编译器带的STL)和linux上的STL(gcc的STL)实现不同。

    windows的STL中,map的erase方法会返回一个iterator,这个iterator指向的是当前被删除的iterator后面的iterator,所以这样的话,只需要将用于循环的iterator赋成erase函数的返回值就可以了。参考上面代码,就是这样:

    mapit = map1.erase(mapit);然后continue就可以。

    但是Linux下这样写代码是无法通过编译的。

  • 相关阅读:
    IE 兼容问题笔记
    php编码与解码
    php 一些神奇加有趣的函数
    RESTful 规范
    关于CSS3背景渐变色无效问题
    ECShop
    php中的PHP_EOL换行符
    用 openSSL 生成 公钥 私钥
    app调用支付宝支付 笔记
    utf8 文件 错误保存为gbk 中文乱码 解决方法
  • 原文地址:https://www.cnblogs.com/super119/p/2207541.html
Copyright © 2020-2023  润新知