zoukankan      html  css  js  c++  java
  • std::map中erase的正确用法

    STL的map表里有一个erase方法用来从一个map中删除掉指令的节点
    eg:
    map<string,string> mapTest;
    typedef map<string,string>::iterator ITER;
    ITER iter=mapTest.find(key);
    mapTest.erase(iter);
    像上面这样只是删除单个节点,map的形为不会出现任务问题,
    但是当在一个循环里用的时候,往往会被误用,那是因为使用者没有正确理解iterator的概念.
    像下面这样的一个例子就是错误的写法,
    eg.
    for(ITER iter=mapTest.begin();iter!=mapTest.end();++iter)
    {
    cout<<iter->first<<":"<<iter->second<<endl;
    mapTest.erase(iter);
    }
    这是一种错误的写法,会导致程序行为不可知.究其原因是map 是关联容器,对于关联容器来说,如果某一个元素已经被删除,那么其对应的迭代器就失效了,不应该再被使用;否则会导致程序无定义的行为。
    可以用以下方法解决这问题:
    正确的写法
    1.使用删除之前的迭代器定位下一个元素。STL建议的使用方式
    for(ITER iter=mapTest.begin();iter!=mapTest.end();) //注意此处不能再写iter++
    {
    cout<<iter->first<<":"<<iter->second<<endl;
    mapTest.erase(iter++);
    }
    2. erase() 成员函数返回下一个元素的迭代器
    for(ITER iter=mapTest.begin();iter!=mapTest.end();)
    {
    cout<<iter->first<<":"<<iter->second<<endl;
    iter=mapTest.erase(iter);
    }

  • 相关阅读:
    OleDbCommand 的用法
    递归求阶乘
    C#重写窗体的方法
    HDU 5229 ZCC loves strings 博弈
    HDU 5228 ZCC loves straight flush 暴力
    POJ 1330 Nearest Common Ancestors LCA
    HDU 5234 Happy birthday 01背包
    HDU 5233 Gunner II 离散化
    fast-IO
    HDU 5265 pog loves szh II 二分
  • 原文地址:https://www.cnblogs.com/hzcya1995/p/13318533.html
Copyright © 2011-2022 走看看