【发布时间】:2018-09-19 22:51:41
【问题描述】:
我有一个 std::multimap 将会话 ID (ints) 映射到该会话中使用的硬件(硬件由包含一些硬件特定信息的 struct 描述)。
我有一个清理功能,它必须对每个硬件进行特定的清理工作。清理完成后,我需要从地图中删除该元素,因为该会话中不再使用硬件。
请注意,我不只是想从会话中删除单个硬件。相反,整个会话被拆除,所以我想在地图中搜索会话 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()(因此在递增之前使迭代器无效)。对吗?
【问题讨论】:
-
仅供参考,
std::multimap有一个iterator-range-based erase method。 -
@WhozCraig 对,但无论如何我都必须循环遍历所有元素,所以我更喜欢使用
erase()方法,它只获取迭代器位置并在摊销的常数时间内执行操作,而不是稍后调用基于迭代器范围的方法,该方法需要log(c.size()) + std::distance(first, last)时间并希望我的编译器在优化时结合循环。 -
一种更安全的
session_map_.erase(it++)方法是it = session_map_.erase(it)--erase()在被擦除的迭代器之后返回下一个迭代器。