我试图从一个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;


因此,从多映射中删除元素后,我就可以验证迭代器,该程序将停在delete()调用中。所以我以以下方式使用它来获取下一个有效的迭代器:

mItr = healthyQ.erase(mItr);


有效。它花费了很多时间,但我仍然不确定问题出在哪里

最佳答案

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

当您将迭代器保存到基于树的容器中并擦除它时,它将更改指向该节点(和其他节点)的各个节点之间的指针。即使您确切知道该节点是什么(通过迭代器),也不会指示下一个节点(因此是下一个迭代器)是什么。因此,erase方法首先找到下一个节点,执行擦除,然后将迭代器返回到该下一个节点。

您可以看到here清除在红黑树中如何工作。

07-26 09:25