c++ - 迭代时 std::multimap::erase()

标签 c++ c++11

我有一个 std::multimap ,它将 session ID (int) 映射到该 session 中使用的硬件(硬件由 >struct 包含一些特定于硬件的信息)。

我有一个清理功能,必须为每个硬件执行特定的清理工作。清理完成后,我需要从 map 中删除该元素,因为该 session 中不再使用硬件。

请注意,我不仅仅想从 session 中删除单个硬件。相反,整个 session 都会被拆除,因此我想在映射中搜索 session ID、清理硬件并从映射中删除所有这些条目。

这里有一些代码显示了我想要解释的内容:

void MyClass::end_session(const int session_id) {
  // session_map_ is a member variable of MyClass
  const auto range = session_map_.equal_range(session_id);
  for (auto it = range.first; it != range.second; session_map_.erase(it++)) {
    // do cleanup for the hardware pointed to by it->second
  }
}

循环合法吗?我知道传递给 erase() 的迭代器会失效,但这不会使 range.firstrange.second 失效,正确?另外,session_map_.erase(it++) 是否像我期望的那样工作?也就是说,我假设 it 被保存为 erase() 的参数,递增到其新值,然后 erase() 被调用以获取旧值(从而使迭代器在增量之前无效)。这是正确的吗?

最佳答案

文档说

Other references and iterators are not affected

因此,您的循环按预期运行,并且 erase 按预期工作。

假设您有 4 个元素,在您的情况下,循环运行 4 次没有任何问题。

https://en.cppreference.com/w/cpp/container/multimap/erase

关于c++ - 迭代时 std::multimap::erase(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52415196/

相关文章:

c++ - 在 C++ 中将 2D 屏幕坐标转换为 3D 空间坐标?

c++ - 如果存储原始引用的类超出范围,捕获成员引用是否安全?

c++ - 检查数组中消息的最有效方法

c++ - boost::variant 递归问题

c++ - 为什么我不能在 c++0x 的 lambda 中声明一个结构变量?

c++ - 如何解决负数情况下程序以相同方式工作的问题?

C++ float 和 int 除法奇怪的行为

c++ - std::vector::erase 异常安全

c++ - 一个奇怪的字符出现在我的字符数组的第一个

c++ - 基于范围的 for 循环和 std::vector.push_back() 使程序崩溃