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++;
            }    
        }
        
  • 相关阅读:
    Microsoft Excel 不能使用对象链接和嵌入的错误/cannot use object linking and enbedding
    (转)QML代码与现有Qt UI代码整合
    vs2012编译Qwt
    参数和返回类型也可以多态
    多态的运行
    调用哪个方法
    继承的意义
    设计继承树2
    设计继承树1
    了解继承
  • 原文地址:https://www.cnblogs.com/rednodel/p/10783924.html
Copyright © 2011-2022 走看看