std::map在過去的舊的實現中,map::erase()的返回值類型爲void,在遍歷過程當中,若是要erase,要格外當心,由於iter會在某些狀況下失效。ide
std::map<int, int> mapTest; mapTest.insert(std::make_pair(1, 1)); mapTest.insert(std::make_pair(2, 2)); mapTest.insert(std::make_pair(3, 3)); mapTest.insert(std::make_pair(4, 4)); mapTest.insert(std::make_pair(5, 5)); // Wrong! to erase the last iter std::map<int, int>::iterator iter = mapTest.begin(); for(; iter != mapTest.end(); ++iter) { int key = iter->first; printf("%d\t", key); if(key == 5) { mapTest.erase(iter); } }
// Wrong: std::map<int, int>::iterator iter = mapTest.begin(); for(; iter != mapTest.end(); ) { int key = iter->first; printf("%d\t", key); if(key == 5) { std::map<int, int>::iterator iterTmp = iter; mapTest.erase(iterTmp); ++iter; continue; } ++iter; }
// Correct: std::map<int, int>::iterator iter = mapTest.begin(); for(; iter != mapTest.end(); ) { int key = iter->first; printf("%d\t", key); if(key == 5) { std::map<int, int>::iterator iterTmp = iter; ++iter; mapTest.erase(iterTmp); continue; } ++iter; }
// Correct std::map<int, int>::iterator iter = mapTest.begin(); for(; iter != mapTest.end(); ) { int key = iter->first; printf("%d\t", key); if(key == 5) { mapTest.erase(iter++); continue; } ++iter; }
在新版的實現中,std::map::erase返回值類型爲std::map::iterator,返回下一個iterator,那咱們在以上的狀況中,就能夠寫成:it
std::map<int, int>::iterator iter = mapTest.begin(); for(; iter != mapTest.end(); ) { int key = iter->first; printf("%d\t", key); if(key == 5) { iter = mapTest.erase(iter); continue; } ++iter; }