从from std::multimap中删除元素时的特殊行为
Peculiar behaviour while erasing an element from from std::multimap
我试图从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()
捕获迭代器返回并稍后重用时,您可以正确处理迭代器并避免迭代器失效。
相关文章:
- 如何在向量中删除 std::function<void()>?
- 从其存储的回调中删除 std::函数是否安全
- C++从 std::vector<std::function<中删除 std::function>>
- 在调用过程中删除 std::函数
- 自定义类对象的C++向量 - 复制构造函数已删除 - std::ifstream
- 删除 std::函数映射
- 如何正确删除 std::string 数组
- 删除 std::future 和 std::p romise 的空白专用化
- 删除 std::string 上的反斜杠字符时出现问题
- 从 std::list 中删除 std::tuple
- 删除 std::set<Node *> 中的元素的正确方法
- 强制删除 std::shared_ptr 在C++
- 使用“memmove”删除 std::string 的第一个字符
- 为什么当我删除 std::vector 的成员时我的程序崩溃
- 按值删除 std::vector 中的对象
- 如何正确删除 std::list 中的指针
- 无法删除 std::vector & std::array?
- 如何删除std::vector末尾的几个元素
- 如何使用正则表达式删除std::wstring中特定短语的所有实例
- 在notify_all崩溃后直接删除std::condition_variable_any