Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

数值操作 (Numeric operations)

数值算法定义在 <numeric> 中,用于对范围进行求和、折叠、扫描等数值计算。C++17 引入了支持执行策略的并行版本(reduce、scan 等),它们允许以任意顺序组合元素,从而获得更好的并行性能。

主要头文件:

  • <numeric>:包含所有传统的数值算法和 C++17 的并行数值算法。
  • <ranges>:包含 ranges::iota。

算法总览

算法C++ 版本头文件描述
iota(C++11)<numeric>用递增的起始值填充一个范围
accumulate<numeric>对元素范围求和或折叠
inner_product<numeric>计算两个元素范围的内积
adjacent_difference<numeric>计算相邻元素之间的差值
partial_sum<numeric>计算元素范围的部分和
reduce(C++17)<numeric>类似于 accumulate,但允许无序归约
exclusive_scan / inclusive_scan(C++17)<numeric>计算独占扫描或包含扫描
transform_reduce(C++17)<numeric>先应用可调用对象,再无序归约
transform_exclusive_scan / transform_inclusive_scan(C++17)<numeric>先应用可调用对象,再计算扫描

说明: 表中「C++ 版本」列标注的是该算法(或 ranges:: 版本)首次引入的标准版本,留空表示自 C++98 起即存在。

共性说明

  • accumulate vs reduce:accumulate 严格按顺序计算,因此要求运算满足结合律即可;reduce 允许任意顺序组合,因此运算必须满足交换律和结合律,否则结果不确定。
  • 扫描的差异:partial_sum 属于包含扫描;exclusive_scan 的第 \( N \) 个结果不包含第 \( N \) 个输入元素;inclusive_scan 则包含。
  • 并行支持:reduce、exclusive_scan、inclusive_scan、transform_reduce、transform_*_scan 支持执行策略;accumulate、inner_product、partial_sum、adjacent_difference 不支持。
  • ranges:: 版本:目前只有 ranges::iota(C++23),其余数值算法暂无 Ranges 版本。