# Standard library header <numeric>

From cppreference.com
< cpp‎ | header

This header is part of the numeric library.

### Functions

iota (C++11) | fills a range with successive increments of the starting value (function template)
accumulate | sums up a range of elements (function template)
reduce (C++17) | similar to std::accumulate, except out of order (function template)
transform_reduce (C++17) | applies a functor, then reduces out of order (function template)
inner_product | computes the inner product of two ranges of elements (function template)
adjacent_difference | computes the differences between adjacent elements in a range (function template)
partial_sum | computes the partial sum of a range of elements (function template)
inclusive_scan (C++17) | similar to std::partial_sum, includes the ith input element in the ith sum (function template)
exclusive_scan (C++17) | similar to std::partial_sum, excludes the ith input element from the ith sum (function template)
transform_inclusive_scan (C++17) | applies a functor, then calculates inclusive scan (function template)
transform_exclusive_scan (C++17) | applies a functor, then calculates exclusive scan (function template)
gcd (C++17) | `constexpr` function template returning the greatest common divisor of two integers (function template)
lcm (C++17) | `constexpr` function template returning the least common multiple of two integers (function template)
midpoint (C++20) | midpoint between two numbers or pointers (function template)

### Synopsis

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

      // reduce
      template<class InputIt>
        typename iterator_traits<InputIt>::value_type
          reduce(InputIt first, InputIt last);
      template<class InputIt, class T>
        T reduce(InputIt first, InputIt last, T init);
      template<class InputIt, class T, class BinaryOperation>
        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);

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

      // transform reduce
      template<class InputIt1, class InputIt2, class T>
        T transform_reduce(InputIt1 first1, InputIt1 last1,
                           InputIt2 first2,
                           T init);
      template<class InputIt1, class InputIt2, class T,
               class BinaryOperation1, class BinaryOperation2>
        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>
        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);

      // partial sum
      template<class InputIt, class OutputIt>
        OutputIt partial_sum(InputIt first,
                             InputIt last,
                             OutputIt result);
      template<class InputIt, class OutputIt, class BinaryOperation>
        OutputIt partial_sum(InputIt first,
                             InputIt last,
                             OutputIt result,
                             BinaryOperation binary_op);

      // exclusive scan
      template<class InputIt, class OutputIt, class T>
        OutputIt exclusive_scan(InputIt first, InputIt last,
                                OutputIt result,
                                T init);
      template<class InputIt, class OutputIt, class T, class BinaryOperation>
        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);

      // inclusive scan
      template<class InputIt, class OutputIt>
        OutputIt inclusive_scan(InputIt first, InputIt last, OutputIt result);
      template<class InputIt, class OutputIt, class BinaryOperation>
        OutputIt inclusive_scan(InputIt first, InputIt last,
                                OutputIt result,
                                BinaryOperation binary_op);
      template<class InputIt, class OutputIt, class BinaryOperation, class T>
        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);

      // transform exclusive scan
      template<class InputIt, class OutputIt, class T,
               class BinaryOperation, class UnaryOperation>
        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);

      // transform inclusive scan
      template<class InputIt, class OutputIt,
               class BinaryOperation, class UnaryOperation>
        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>
        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);

      // adjacent difference
      template<class InputIt, class OutputIt>
        OutputIt adjacent_difference(InputIt first, InputIt last,
                                     OutputIt result);
      template<class InputIt, class OutputIt, class BinaryOperation>
        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>
        void iota(ForwardIt first, ForwardIt last, T value);

      // greatest common divisor
      template<class M, class N>
        constexpr common_type_t<M, N> gcd(M m, N n);

      // least common multiple
      template<class M, class N>
        constexpr common_type_t<M, N> lcm(M m, N n);

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

Retrieved from "https://en.cppreference.com/mwiki/index.php?title=cpp/header/numeric&oldid=109964"