zoukankan      html  css  js  c++  java
  • C++ map 使用erase在windows下崩溃,在linux下没有问题的原因

    注意:此程序在win环境下会出现上述描述的问题;在mac环境下第一种方式是正常运行的。Map.erase有3个重载函数:

    void erase(iterator position);

    size_type erase(const key_type& x);  // 这个如果size_type为int,则返回值为1时代表删除成功,为0代表删除失败。

    void erase(iterator first, iterator last);   // 相当于map.clean()。

    1. 错误示范

    备注:map是关联式容器,调用erase后,当前迭代器已经失效

      std::map<int, int> mmap;
        mmap[0] = 0;
        mmap[1] = 1;
        mmap[2] = 2;
        mmap[3] = 3;
    
        std::map<int, int>:: iterator it = mmap.begin();
        for( ; it!=mmap.end(); it++)
        {
            if(it->first == 2)
            {
                mmap.erase(it); //执行后,it失效,程序崩溃。
            }
        }

    2. 正确示范(1)

     std::map<int, int> mmap;
        mmap[0] = 0;
        mmap[1] = 1;
        mmap[2] = 2;
        mmap[3] = 3;
    
        std::map<int, int>:: iterator it = mmap.begin();
        for( ; it!=mmap.end(); it++)
        {
            if(it->first == 2)
            {
                mmap.erase(it++); // erase之后,令当前迭代器指向其后继。
            }
        }

    3. 正确示范(2)

    备注:利用erase的返回值,注意,有些版本的stl-map没有返回值,比如SGI版,但vc版的有。

    std::map<int, int> mmap;
        mmap[0] = 0;
        mmap[1] = 1;
        mmap[2] = 2;
        mmap[3] = 3;
    
        std::map<int, int>:: iterator it = mmap.begin();
        for( ; it!=mmap.end(); )
        {
            if(it->first == 2)
            {
                it = mmap.erase(it); // erase的返回值是指向被删除元素的后继元素的迭代器
            }
            else
           {
                 it++;
            }    
        }
        
  • 相关阅读:
    AcWing 3772. 更新线路(BFS)
    AcWing 3760. 最大剩余油量(树的最长路径)
    AcWing 3771. 选取石子
    洛谷P2014—选课(树形DP)
    吴恩达机器学习ex1
    洛谷P1122—最大子树和(树形DP)
    论文中关于要使用600线的python代码
    mysql 笛卡尔积
    mysql 外键
    写参考文献有感
  • 原文地址:https://www.cnblogs.com/rednodel/p/10783924.html
Copyright © 2011-2022 走看看