gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 01:28:21 24 4
gpt4 key购买 nike

我有一个 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com