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

