我有一个std::multimap
,它将 session ID(int
s)映射到该 session 中使用的硬件(硬件由包含一些特定于硬件的信息的struct
描述)。
我有一个清理功能,必须对每个硬件进行特定的清理工作。清理完成后,我需要从映射中删除该元素,因为该 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.first
或range.second
失效,对吗?另外,session_map_.erase(it++)
是否像我期望的那样工作?也就是说,我假设it
被保存为erase()
的参数,被递增到其新值,然后为旧值调用erase()
(因此在递增之前使迭代器无效)。那是对的吗? 最佳答案
该文件说
因此,您的循环按预期运行,erase
按预期运行。
假设您有4个元素,在这种情况下,循环运行4次没有任何问题。
https://en.cppreference.com/w/cpp/container/multimap/erase
关于c++ - 迭代时std::multimap::erase(),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52415196/