从 std::multimap 中删除元素时的特殊行为

Peculiar behaviour while erasing an element from from std::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);

成功了。耗费了很多时间,我仍然不确定问题出在哪里

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

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

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

您可以看到here移除是如何在红黑树中进行的。