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

C++ std::multimap如何实现begin+3到end-3范围遍历?原写法为何失效

问题原因
  • std::multimap 底层采用红黑树结构实现,其迭代器属于双向迭代器,仅支持单步++(前移)、--(后移)、解引用、相等/不等比较操作,不支持随机访问迭代器才有的+/-整数偏移算术运算,因此原代码中_multimap.begin() + 3、_multimap.end() - 3的写法会直接编译失败。只有std::vector、std::deque、std::array这类连续内存容器的迭代器是随机访问迭代器,才支持直接用加减整数做偏移。
  • 原代码未做边界校验:如果容器内元素总数小于6,前后各偏移3位会直接导致迭代器越界,触发未定义行为。
正确实现方案

使用标准库提供的std::next、std::prev工具函数完成迭代器偏移,这两个函数会自动适配迭代器类型:对随机访问迭代器直接做算术计算保证效率,对双向迭代器则通过重复单步移动完成偏移,适配std::multimap这类关联容器的迭代器。
偏移前必须先校验容器元素数量,避免越界。参考代码如下:

#include <iostream>
#include <map>
#include <iterator>  // 必须引入该头文件以使用std::next、std::prev

int main() {
    std::multimap<int, int> _multimap;
    // 此处省略容器元素填充逻辑

    // 边界校验:元素总数不足6时前后各偏移3位会越界,可根据实际业务需求处理该场景
    if (_multimap.size() >= 6) {
        auto start = std::next(_multimap.begin(), 3);
        auto end = std::prev(_multimap.end(), 3);
        for (auto it = start; it != end; ++it) {
            std::cout << it->first << '\n';
        }
    }
    return 0;
}

说明:按照C++迭代器左闭右开的惯例,上述代码在容器元素总数为10时,会遍历从偏移量3开始、到偏移量6为止的元素(共4个)。如果需要包含偏移量为7的元素,只需将结束迭代器的偏移量改为2即可,即auto end = std::prev(_multimap.end(), 2);,可根据实际遍历范围需求调整偏移参数。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 21:01:15