• STL-multimap


    如果键值是string型,直接输出就可以了,multimap是排好序了的,

    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();)
    {
    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);
    }

  • 相关阅读:
    第03组 团队Git现场编程实战
    团队Git现场编程实战
    第二次结对编程作业
    团队项目-需求分析报告
    团队项目-选题报告
    第一次结对编程作业
    第一次个人编程作业
    第一次博客作业
    第四组 团队Git现场编程实战
    第二次结对编程作业
  • 原文地址:https://www.cnblogs.com/chris-cp/p/3765198.html
Copyright © 2020-2023  润新知