0

我正在循环通过 STL 映射来删除元素并进行一些清理。对我来说不幸的是,我的程序在 ++iter 行上崩溃了。我在地图上循环的方式有问题吗?

std::map<string,BoneHierarchy* >::iterator iter = boneMap.begin();
while(iter != boneMap.end()) {
    string playerName = iter->first;
    boneMap[playerName]->clear();
    boneQueue->push(boneMap[playerName]);
    boneMap.erase(iter);
    ++iter;
}
4

2 回答 2

6

删除迭代器后不要增加它(它已被删除,那么你怎么能期望增加它?)。使用以下命令擦除迭代器的副本:

boneMap.erase(iter++);

或者做

iter = boneMap.erase(iter);

如果使用 C++11。

(另请参阅通过 for 循环从 C++ 映射中删除元素

于 2012-04-21T15:55:12.757 回答
3
boneMap.erase(iter);
++iter;                     //incorrect

应该写成:

iter = boneMap.erase(iter); //correct (in C++11)
//no need to increment!

因为map::erase()在删除的 item 之后返回迭代器

于 2012-04-21T15:55:16.363 回答