如何在C++中从函数返回可迭代的range范围视图
问题根源
范围for循环要求被遍历的对象满足std::ranges::range概念,也就是需要支持调用std::ranges::begin()和std::ranges::end()获取首尾迭代器。你当前返回的std::tuple不满足该要求,因此无法直接用于范围for遍历。
解决方案
使用C++20标准库提供的std::ranges::subrange包装你的迭代器对,它是专门用来将首尾迭代器封装为合法range的工具,不会额外拷贝容器元素,性能和原生迭代器遍历完全一致。
修改后的完整代码
#include <set> #include <ranges> std::set<int> set{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; auto find_range(int a) { auto left = set.lower_bound(a - 3); auto right = set.upper_bound(a + 3); // 直接构造subrange返回即可 return std::ranges::subrange{left, right}; } int main() { // 此时可以直接用范围for遍历 for (int x : find_range(5)) { // 遍历结果为 2、3、4、5、6、7、8,符合预期 } }
补充说明
- 代码需要C++20及以上版本支持,编译时需要指定对应标准:gcc/clang加编译参数
-std=c++20,MSVC加编译参数/std:c++20 - 如果需要兼容C++17及更早标准,可以自定义一个简单的迭代器包装结构体,只要实现
begin()和end()成员方法返回对应迭代器即可,无需额外依赖
内容的提问来源于stack exchange,提问作者Dmitriano
相关产品推荐
相关产品推荐

