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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 21:54:00