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

如何对C++20的std::range求和?除遍历外有其他惯用方法吗?

针对C++ ranges视图的惯用求和方法

方法1:适配std::accumulate,显式传入迭代器

直接用std::ranges::begin和std::ranges::end获取视图的迭代器对,传给std::accumulate,这是最直接的标准方案,无需手动遍历:

#include <numeric>
#include <ranges>

// 假设all_truncatable_primes是你生成的视图
auto sum = std::accumulate(std::ranges::begin(all_truncatable_primes),
                           std::ranges::end(all_truncatable_primes),
                           0LL); // 用long long避免溢出,适配Project Euler的数值规模

方法2:使用std::ranges::fold_left(C++23及以上)

C++23正式引入了std::ranges::fold_left,这是专为范围设计的折叠操作,完美适配视图类型:

#include <ranges>

// 显式指定累加操作
auto sum = std::ranges::fold_left(all_truncatable_primes, 0LL, std::plus<>{});

// 简化版:默认使用std::plus<>
auto sum = std::ranges::fold_left(all_truncatable_primes, 0LL);

方法3:利用编译器扩展的views::fold(非标准)

部分编译器(如GCC)提供了std::views::fold扩展,可以直接在视图链中嵌入求和逻辑:

auto sum = all_truncatable_primes | std::views::fold(0LL, std::plus<>{});

注意这是非标准特性,移植性不如前两种标准方案,仅适合特定编译环境。

以上三种方式都不需要手动编写循环遍历,属于C++ ranges生态下的惯用写法,优先推荐前两种标准方案。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 17:52:05