当前位置:首页 > 操作系统 > Windows

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<<span>int</span>, <span>int</span>><span> mmap;
    mmap[</span><span>0</span>] = <span>0</span><span>;
    mmap[</span><span>1</span>] = <span>1</span><span>;
    mmap[</span><span>2</span>] = <span>2</span><span>;
    mmap[</span><span>3</span>] = <span>3</span><span>;

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

2. 正确示范(1)

 std::map<<span>int</span>, <span>int</span>><span> mmap;
    mmap[</span><span>0</span>] = <span>0</span><span>;
    mmap[</span><span>1</span>] = <span>1</span><span>;
    mmap[</span><span>2</span>] = <span>2</span><span>;
    mmap[</span><span>3</span>] = <span>3</span><span>;

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

3. 正确示范(2)

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

std::map<<span>int</span>, <span>int</span>><span> mmap;
    mmap[</span><span>0</span>] = <span>0</span><span>;
    mmap[</span><span>1</span>] = <span>1</span><span>;
    mmap[</span><span>2</span>] = <span>2</span><span>;
    mmap[</span><span>3</span>] = <span>3</span><span>;

    std::map</span><<span>int</span>, <span>int</span>>:: iterator it =<span> mmap.begin();
    </span><span>for</span>( ; it!=<span>mmap.end(); )
    {
        </span><span>if</span>(it->first == <span>2</span><span>)
        {
            it </span>= mmap.erase(it); <span>//</span><span> erase的返回值是指向被删除元素的后继元素的迭代器</span><span>        }
        </span><span>else</span><span>
       {
             it</span>++<span>;
        }    
    }
    </span>

 

原文:https://www.cnblogs.com/rednodel/p/10783924.html


【说明】本文章由站长整理发布,文章内容不代表本站观点,如文中有侵权行为,请与本站客服联系(QQ:254677821)!

相关教程推荐

其他课程推荐