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++;
            }    
        }
        
  • 相关阅读:
    Python垃圾回收机制 总结
    求二叉树中任意两个结点的距离
    Python 实现排序算法
    InnoDB 索引原理
    Linux常用脚本命令总结
    How Django works?
    RabbitMQ 知识总结
    最短路径之Dijkstra算法和Floyd-Warshall算法
    最小生成树之Prim算法和Kruskal算法
    Python collections模块总结
  • 原文地址:https://www.cnblogs.com/rednodel/p/10783924.html
Copyright © 2011-2022 走看看