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
相关产品推荐
相关产品推荐

