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

Peculiar behaviour while erasing an element from from std::multimap

本文关键字:删除 std from multimap 元素      更新时间:2023-10-16

我试图从std::multimap中删除一个元素,而我正在操作它的线程中循环它。我以下列方式使用擦除函数

当我这样做

//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()函数使迭代器无效。因此,当您从erase()捕获迭代器返回并稍后重用时,您可以正确处理迭代器并避免迭代器失效。