从equal_range获iterator对后,如何用范围for循环遍历?有无标准方案?
回答
好问题!其实不用自己手动实现包装类,标准库或者Boost本身就有现成的方案,给你梳理几种最常用的:
1. C++20 标准库的 std::ranges::subrange
如果你的项目已经升级到C++20,那直接用标准库的std::ranges::subrange就完事了——它就是专门用来把一对迭代器包装成可遍历范围的工具,完全符合标准设计,不用造轮子:
#include <ranges> // 先拿到equal_range返回的迭代器对 auto [first, last] = your_multi_index_container.equal_range(target_key); // 直接用subrange包装后遍历 for (auto& element : std::ranges::subrange(first, last)) { // 在这里处理每个element }
这个方案类型安全、可读性拉满,是C++20及以后的最优解。
2. Boost 自带的 boost::iterator_range
既然你本来就在用Boost的multi_index容器,那可以直接用Boost提供的boost::iterator_range,它就是为这种场景量身打造的,兼容性还更好:
#include <boost/range/iterator_range.hpp> auto range_pair = your_multi_index_container.equal_range(target_key); // 两种写法都可以: // 写法1:直接传入两个迭代器 for (auto& element : boost::make_iterator_range(range_pair.first, range_pair.second)) { // 处理逻辑 } // 写法2:直接传入整个pair for (auto& element : boost::iterator_range(range_pair)) { // 处理逻辑 }
完全贴合你使用Boost的场景,不需要自己写模板类,Boost已经帮你封装好了所有细节。
3. 兼容旧标准的手动迭代(C++17及之前)
如果你的项目还不能用C++20,也不想额外引入Boost的range组件,那最稳妥的就是手动用迭代器遍历,虽然不如范围for简洁,但胜在无依赖、兼容性拉满:
auto range_pair = your_multi_index_container.equal_range(target_key); for (auto it = range_pair.first; it != range_pair.second; ++it) { auto& element = *it; // 处理element }
这种写法虽然少了点“语法糖”,但也是标准的迭代器遍历方式,不会有任何额外问题。
对比你自己写的merge类,上面这些方案要么是标准库/Boost原生支持,要么是更通用的标准写法,维护性和可读性都更好,也能避免自己写模板可能带来的潜在问题。
内容的提问来源于stack exchange,提问作者Dimfred
相关产品推荐
相关产品推荐

