以下内容是老大的经验之谈。
我就通过代码,把这经验具体化
以下代码是不安全的,由于对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把数据清除。
因为各种平台,各种语言,各种表,都是不同的人写的。删除数据之后,迭代器会变什么,是不确定的。除非你对正在使用的表十分十分十分熟悉。否则,不能因为不熟悉而导致错误
我又学到东西了