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++;
        }    
    }
    

 

posted on 2019-04-28 14:47  矮油~  阅读(1643)  评论(0编辑  收藏  举报

导航