经验之谈根据值寻找表中的数据,然后删除

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

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

以下代码是不安全的,由于对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把数据清除。

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

我又学到东西了

原文地址:https://www.cnblogs.com/yemsheng/p/3043533.html