zoukankan      html  css  js  c++  java
  • 经验之谈根据值寻找表中的数据,然后删除

    以下内容是老大的经验之谈。

    我就通过代码,把这经验具体化

    以下代码是不安全的,由于对STL的不熟悉,删除之后,迭代器加加,以为迭代器会指向下一个。最后,结果有可能是不对的

    #include<iostream>
    #include<map>
    using namespace std;
    
    int main()
    {
        map<char, int> mymap;
        map<char, int>::iterator iter;
        mymap['a'] = 10;
        mymap['b'] = 30;
        mymap['c'] = 30;
        mymap['d'] = 30;
        mymap['e'] = 50;
        int value = 30;
        
        iter = mymap.begin();
        while(iter!=mymap.end())
        {
            if(value==iter->second)
                mymap.erase(iter->first);
            iter++;
        }
    
        return 0;
    }

    下面代码加了一个队列来记录数据。得到的结果是安全的,肯定能把所有删除

    #include<iostream>
    #include<map>
    #include<deque>
    using namespace std;
    
    int main()
    {
        map<char, int> mymap;
        map<char, int>::iterator iter;
        mymap['a'] = 10;
        mymap['b'] = 30;
        mymap['c'] = 30;
        mymap['d'] = 30;
        mymap['e'] = 50;
        int value = 30;
        
        deque<char> mydeque;
    
        iter = mymap.begin();
        while(iter!=mymap.end())
        {
            if(value==iter->second)
                mydeque.push_back(iter->first);
            iter++;
        }
        while(mydeque.empty()==false)
        {
            mymap.erase(mydeque.front());
            mydeque.pop_front();
        }
    
        return 0;
    }

    像这种需要根据值来删除表中的数据,最保险的方法是先把index或者key找出来放在一个地方,也不会浪费很多空间。找完之后,再来根据index或key把数据清除。

    因为各种平台,各种语言,各种表,都是不同的人写的。删除数据之后,迭代器会变什么,是不确定的。除非你对正在使用的表十分十分十分熟悉。否则,不能因为不熟悉而导致错误

    我又学到东西了

  • 相关阅读:
    51nod1376 最长递增子序列的数量
    51nod1201 整数划分
    51nod1202 子序列个数
    51nod 博弈论水题
    51nod1052 最大M子段和
    51nod1678 lyk与gcd
    51nod1262 扔球
    BZOJ2763, 最短路
    吃西瓜 最大子矩阵 三维的。 rqnoj93
    noip2015 信息传递 强连通块
  • 原文地址:https://www.cnblogs.com/yemsheng/p/3043533.html
Copyright © 2011-2022 走看看