参考
http://t.zoukankan.com/riskyer-p-3343268.html
为什么
for(auto i=map.begin();i!=map.end();++i) if(i.first==value)
map.erase(i);
这种写法不行?
因为在这段代码中,i的自增是放在最后面执行的,当删除符合条件的i时,这个迭代器i也会被删掉,此时没办法对一个空地址进行自增操作,所以会报错
写法1
for(auto i=map.begin();i!=map.end()) if(i.first==value) map.erase(i++);
else
i++;
i++的源码
{ tmp=i; i=i+1; return tmp; }
也就是说map删除的iterator还是我们要删掉的那个迭代器,但是在i被删除之前他已经完成自增了,所以不会出错
写法2
for(auto i=map.begin();i!=map.end()) { if(i.first==value) i=map.erase(i); else i++; }
这个需要看erase函数的返回值,参考c++ reference
http://www.cplusplus.com/reference/map/map/
erase()返回的是被删除迭代器的下一个迭代器,因此也不会出错