从 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移除是如何在红黑树中进行的。
我试图从 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移除是如何在红黑树中进行的。