# 标准库头文件 <numeric>

< cpp‎ | header

此头文件是数值库的一部分。

### 函数
iota (C++11) | 用从起始值开始连续递增的值填充一个范围 (函数模板)
accumulate | 对一个范围内的元素求和 (函数模板)
reduce (C++17) | 类似 std::accumulate，但不依序执行 (函数模板)
transform_reduce (C++17) | 应用一个函数对象，然后以乱序规约 (函数模板)
inner_product | 计算两个范围的元素的内积 (函数模板)
adjacent_difference | 计算范围内各相邻元素之间的差 (函数模板)
partial_sum | 计算范围内元素的部分和 (函数模板)
inclusive_scan (C++17) | 类似 std::partial_sum，第 i 个和中包含第 i 个输入 (函数模板)
exclusive_scan (C++17) | 类似 std::partial_sum，第 i 个和中排除第 i 个输入 (函数模板)
transform_inclusive_scan (C++17) | 应用一个函数对象，然后进行包含扫描 (函数模板)
transform_exclusive_scan (C++17) | 应用一个函数对象，然后进行排除扫描 (函数模板)
gcd (C++17) | 返回二个整数最大公约数的 `constexpr` 函数模板 (函数模板)
lcm (C++17) | 返回二个整数最小公倍数的 `constexpr` 函数模板 (函数模板)
midpoint (C++20) | 两个数值或指针间的中点 (函数模板)

### 概要

    namespace std {
      // 累加
      template<class InputIt, class T>
        constexpr T accumulate(InputIt first, InputIt last, T init);
      template<class InputIt, class T, class BinaryOperation>
        constexpr T accumulate(InputIt first, InputIt last, T init, BinaryOperation binary_op);

      // 规约
      template<class InputIt>
        constexpr typename iterator_traits<InputIt>::value_type
          reduce(InputIt first, InputIt last);
      template<class InputIt, class T>
        constexpr T reduce(InputIt first, InputIt last, T init);
      template<class InputIt, class T, class BinaryOperation>
        constexpr T reduce(InputIt first, InputIt last, T init, BinaryOperation binary_op);
      template<class ExecutionPolicy, class ForwardIt>
        typename iterator_traits<ForwardIt>::value_type
          reduce(ExecutionPolicy&& exec,
                 ForwardIt first, ForwardIt last);
      template<class ExecutionPolicy, class ForwardIt, class T>
        T reduce(ExecutionPolicy&& exec,
                 ForwardIt first, ForwardIt last, T init);
      template<class ExecutionPolicy, class ForwardIt, class T, class BinaryOperation>
        T reduce(ExecutionPolicy&& exec,
                 ForwardIt first, ForwardIt last, T init, BinaryOperation binary_op);

      // 内积
      template<class InputIt1, class InputIt2, class T>
        constexpr T inner_product(InputIt1 first1, InputIt1 last1,
                                  InputIt2 first2, T init);
      template<class InputIt1, class InputIt2, class T,
               class BinaryOperation1, class BinaryOperation2>
        constexpr T inner_product(InputIt1 first1, InputIt1 last1,
                                  InputIt2 first2, T init,
                                  BinaryOperation1 binary_op1,
                                  BinaryOperation2 binary_op2);

      // 变换规约
      template<class InputIt1, class InputIt2, class T>
        constexpr T transform_reduce(InputIt1 first1, InputIt1 last1,
                                     InputIt2 first2,
                                     T init);
      template<class InputIt1, class InputIt2, class T,
               class BinaryOperation1, class BinaryOperation2>
        constexpr T transform_reduce(InputIt1 first1, InputIt1 last1,
                                     InputIt2 first2,
                                     T init,
                                     BinaryOperation1 binary_op1,
                                     BinaryOperation2 binary_op2);
      template<class InputIt, class T,
               class BinaryOperation, class UnaryOperation>
        constexpr T transform_reduce(InputIt first, InputIt last,
                                     T init,
                                     BinaryOperation binary_op, UnaryOperation unary_op);
      template<class ExecutionPolicy,
               class ForwardIt1, class ForwardIt2, class T>
        T transform_reduce(ExecutionPolicy&& exec,
                           ForwardIt1 first1, ForwardIt1 last1,
                           ForwardIt2 first2,
                           T init);
      template<class ExecutionPolicy,
               class ForwardIt1, class ForwardIt2, class T,
               class BinaryOperation1, class BinaryOperation2>
        T transform_reduce(ExecutionPolicy&& exec,
                           ForwardIt1 first1, ForwardIt1 last1,
                           ForwardIt2 first2,
                           T init,
                           BinaryOperation1 binary_op1,
                           BinaryOperation2 binary_op2);
      template<class ExecutionPolicy,
               class ForwardIt, class T,
               class BinaryOperation, class UnaryOperation>
        T transform_reduce(ExecutionPolicy&& exec,
                           ForwardIt first, ForwardIt last,
                           T init,
                           BinaryOperation binary_op, UnaryOperation unary_op);

      // 部分和
      template<class InputIt, class OutputIt>
        constexpr OutputIt partial_sum(InputIt first,
                                       InputIt last,
                                       OutputIt result);
      template<class InputIt, class OutputIt, class BinaryOperation>
        constexpr OutputIt partial_sum(InputIt first,
                                       InputIt last,
                                       OutputIt result,
                                       BinaryOperation binary_op);

      // 排除扫描
      template<class InputIt, class OutputIt, class T>
        constexpr OutputIt exclusive_scan(InputIt first, InputIt last,
                                          OutputIt result,
                                          T init);
      template<class InputIt, class OutputIt, class T, class BinaryOperation>
        constexpr OutputIt exclusive_scan(InputIt first, InputIt last,
                                          OutputIt result,
                                          T init, BinaryOperation binary_op);
      template<class ExecutionPolicy, class ForwardIt1, class ForwardIt2, class T>
        ForwardIt2 exclusive_scan(ExecutionPolicy&& exec,
                                  ForwardIt1 first, ForwardIt1 last,
                                  ForwardIt2 result,
                                  T init);
      template<class ExecutionPolicy, class ForwardIt1, class ForwardIt2, class T,
               class BinaryOperation>
        ForwardIt2 exclusive_scan(ExecutionPolicy&& exec,
                                  ForwardIt1 first, ForwardIt1 last,
                                  ForwardIt2 result,
                                  T init, BinaryOperation binary_op);

      // 包含扫描
      template<class InputIt, class OutputIt>
        constexpr OutputIt inclusive_scan(InputIt first, InputIt last, OutputIt result);
      template<class InputIt, class OutputIt, class BinaryOperation>
        constexpr OutputIt inclusive_scan(InputIt first, InputIt last,
                                          OutputIt result,
                                          BinaryOperation binary_op);
      template<class InputIt, class OutputIt, class BinaryOperation, class T>
        constexpr OutputIt inclusive_scan(InputIt first, InputIt last,
                                          OutputIt result,
                                          BinaryOperation binary_op, T init);
      template<class ExecutionPolicy, class ForwardIt1, class ForwardIt2>
        ForwardIt2 inclusive_scan(ExecutionPolicy&& exec,
                                  ForwardIt1 first, ForwardIt1 last,
                                  ForwardIt2 result);
      template<class ExecutionPolicy, class ForwardIt1, class ForwardIt2,
               class BinaryOperation>
        ForwardIt2 inclusive_scan(ExecutionPolicy&& exec,
                                  ForwardIt1 first, ForwardIt1 last,
                                  ForwardIt2 result,
                                  BinaryOperation binary_op);
      template<class ExecutionPolicy, class ForwardIt1, class ForwardIt2,
               class BinaryOperation, class T>
        ForwardIt2 inclusive_scan(ExecutionPolicy&& exec,
                                  ForwardIt1 first, ForwardIt1 last,
                                  ForwardIt2 result,
                                  BinaryOperation binary_op, T init);

      // 变换排除扫描
      template<class InputIt, class OutputIt, class T,
               class BinaryOperation, class UnaryOperation>
        constexpr OutputIt transform_exclusive_scan(InputIt first, InputIt last,
                                                    OutputIt result,
                                                    T init,
                                                    BinaryOperation binary_op,
                                                    UnaryOperation unary_op);
      template<class ExecutionPolicy,
               class ForwardIt1, class ForwardIt2, class T,
               class BinaryOperation, class UnaryOperation>
        ForwardIt2 transform_exclusive_scan(ExecutionPolicy&& exec,
                                            ForwardIt1 first, ForwardIt1 last,
                                            ForwardIt2 result,
                                            T init,
                                            BinaryOperation binary_op,
                                            UnaryOperation unary_op);

      // 变换包含扫描
      template<class InputIt, class OutputIt,
               class BinaryOperation, class UnaryOperation>
        constexpr OutputIt transform_inclusive_scan(InputIt first, InputIt last,
                                                    OutputIt result,
                                                    BinaryOperation binary_op,
                                                    UnaryOperation unary_op);
      template<class InputIt, class OutputIt,
               class BinaryOperation, class UnaryOperation, class T>
        constexpr OutputIt transform_inclusive_scan(InputIt first, InputIt last,
                                                    OutputIt result,
                                                    BinaryOperation binary_op,
                                                    UnaryOperation unary_op,
                                                    T init);
      template<class ExecutionPolicy,
               class ForwardIt1, class ForwardIt2,
               class BinaryOperation, class UnaryOperation>
        ForwardIt2 transform_inclusive_scan(ExecutionPolicy&& exec,
                                            ForwardIt1 first, ForwardIt1 last,
                                            ForwardIt2 result,
                                            BinaryOperation binary_op,
                                            UnaryOperation unary_op);
      template<class ExecutionPolicy,
               class ForwardIt1, class ForwardIt2,
               class BinaryOperation, class UnaryOperation, class T>
        ForwardIt2 transform_inclusive_scan(ExecutionPolicy&& exec,
                                            ForwardIt1 first, ForwardIt1 last,
                                            ForwardIt2 result,
                                            BinaryOperation binary_op,
                                            UnaryOperation unary_op,
                                            T init);

      // 相邻差
      template<class InputIt, class OutputIt>
        constexpr OutputIt adjacent_difference(InputIt first, InputIt last,
                                               OutputIt result);
      template<class InputIt, class OutputIt, class BinaryOperation>
        constexpr OutputIt adjacent_difference(InputIt first, InputIt last,
                                               OutputIt result,
                                               BinaryOperation binary_op);
      template<class ExecutionPolicy, class ForwardIt1, class ForwardIt2>
        ForwardIt2 adjacent_difference(ExecutionPolicy&& exec,
                                       ForwardIt1 first, ForwardIt1 last,
                                       ForwardIt2 result);
      template<class ExecutionPolicy, class ForwardIt1, class ForwardIt2,
               class BinaryOperation>
        ForwardIt2 adjacent_difference(ExecutionPolicy&& exec,
                                       ForwardIt1 first, ForwardIt1 last,
                                       ForwardIt2 result,
                                       BinaryOperation binary_op);

      // iota
      template<class ForwardIt, class T>
        constexpr void iota(ForwardIt first, ForwardIt last, T value);

      // 最大公约数
      template<class M, class N>
        constexpr common_type_t<M, N> gcd(M m, N n);

      // 最小公倍数
      template<class M, class N>
        constexpr common_type_t<M, N> lcm(M m, N n);

      // 中点
      template<class T>
        constexpr T midpoint(T a, T b) noexcept;
      template<class T>
        constexpr T* midpoint(T* a, T* b);
    }