You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在反向迭代std::multimap时删除元素?

如何在反向迭代std::multimap时删除元素?

正向迭代std::multimap时删除元素的逻辑很直接,但反向迭代时需要额外处理——因为multimap::erase的返回值是正向迭代器,无法直接赋值给循环中使用的反向迭代器。

解决思路

反向迭代器提供了base()方法,可以将其转换为对应的正向迭代器,但要注意两者的位置关系:反向迭代器rit指向的元素,对应的正向迭代器rit.base()指向的是rit的下一个元素。利用这一点,我们可以通过正向迭代器完成删除操作,再将返回的新正向迭代器重新转换为反向迭代器,维持循环的正确遍历。

代码示例

#include <map>
#include <string>
#include <iostream>

int main() {
    std::multimap<int, std::string> my_map = {{1, "a"}, {2, "b"}, {2, "c"}, {3, "d"}};

    // 反向迭代遍历
    for (auto rit = my_map.rbegin(); rit != my_map.rend(); ) {
        // 假设删除键为2的元素
        if (rit->first == 2) {
            // 将反向迭代器转为正向迭代器
            auto fit = rit.base();
            // 执行删除,得到删除元素的下一个正向迭代器
            fit = my_map.erase(fit);
            // 将新的正向迭代器转回反向迭代器,赋值给rit
            rit = std::reverse_iterator<decltype(fit)>(fit);
        } else {
            // 无需删除时,正常移动反向迭代器
            ++rit;
        }
    }

    // 验证结果
    for (const auto& pair : my_map) {
        std::cout << pair.first << ": " << pair.second << std::endl;
    }
    return 0;
}

关键说明

  • 不能直接在删除后对原反向迭代器执行++rit,因为删除操作会使当前反向迭代器失效。
  • erase返回的正向迭代器指向被删除元素的下一个位置,将其转换为反向迭代器后,正好对应反向遍历的下一个有效位置,保证循环可以继续正确执行。

内容的提问来源于stack exchange,提问作者user1201614

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 12:35:30