当我在一个操纵它的线程中循环它时,我试图从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);
有效。它耗费了大量时间,我仍然不确定问题出在哪里
答案 0 :(得分:3)
第二种方式是exactly how it is supposed to work
当您将迭代器保存到基于树的容器并将其擦除时,它会改变指向此节点(和其他节点)的各个节点之间的指针。即使你确切地知道这个节点是什么(通过迭代器),你也没有任何迹象表明下一个节点是什么(因此,下一个迭代器)。因此,erase
方法 first 找到下一个节点,执行擦除,然后将迭代器返回到下一个节点。
您可以看到here如何在红黑树中删除。
答案 1 :(得分:1)
通过调用erase()
函数使迭代器无效。因此,当您从erase()
捕获迭代器返回并稍后重用时,您正在正确处理迭代器并避免迭代器失效。