从std :: multimap

时间:2015-05-18 13:55:07

标签: c++ c++11 stl multimap

当我在一个操纵它的线程中循环它时,我试图从std :: multimap中删除一个元素。我在以下方面使用了erase function

当我这样做时

//mItr is base iterator which loops over the multimap

std::multimap<std::string, std::string>::iterator tmpItr = ++mItr;
healthyQ.erase(mItr);
mItr = tmpItr;

这样我可以在从multimap中删除元素后验证迭代器,程序在erase()调用中停止。所以我以下面的方式使用它来获取下一个有效的迭代器:

mItr = healthyQ.erase(mItr);

有效。它耗费了大量时间,我仍然不确定问题出在哪里

2 个答案:

答案 0 :(得分:3)

第二种方式是exactly how it is supposed to work

当您将迭代器保存到基于树的容器并将其擦除时,它会改变指向此节点(和其他节点)的各个节点之间的指针。即使你确切地知道这个节点是什么(通过迭代器),你也没有任何迹象表明下一个节点是什么(因此,下一个迭代器)。因此,erase方法 first 找到下一个节点,执行擦除,然后将迭代器返回到下一个节点。

您可以看到here如何在红黑树中删除。

答案 1 :(得分:1)

通过调用erase()函数使迭代器无效。因此,当您从erase()捕获迭代器返回并稍后重用时,您正在正确处理迭代器并避免迭代器失效。