GSP
Quick Navigator

Search Site

Unix VPS
A - Starter
B - Basic
C - Preferred
D - Commercial
MPS - Dedicated
Previous VPSs
* Sign Up! *

Support
Contact Us
Online Help
Handbooks
Domain Status
Man Pages

FAQ
Virtual Servers
Pricing
Billing
Technical

Network
Facilities
Connectivity
Topology Map

Miscellaneous
Server Agreement
Year 2038
Credits
 

USA Flag

 

 

Man Pages
std::reduce(3) C++ Standard Libary std::reduce(3)

std::reduce - std::reduce


Defined in header <numeric>
template< class InputIt > (since
C++17)
typename std::iterator_traits<InputIt>::value_type (until
C++20)
reduce( InputIt first, InputIt last );
template< class InputIt >


constexpr typename (since
std::iterator_traits<InputIt>::value_type C++20)


reduce( InputIt first, InputIt last );
template< class ExecutionPolicy, class ForwardIt >


typename std::iterator_traits<ForwardIt>::value_type (2) (since
reduce( ExecutionPolicy&& policy, C++17)


ForwardIt first, ForwardIt last );
(since
template< class InputIt, class T > C++17)
T reduce( InputIt first, InputIt last, T init ); (until
C++20)
template< class InputIt, class T > (1) (since
constexpr T reduce( InputIt first, InputIt last, T C++20)
init );
template< class ExecutionPolicy, class ForwardIt,
class T >
(4) (since
T reduce( ExecutionPolicy&& policy, C++17)


ForwardIt first, ForwardIt last, T init );
template< class InputIt, class T, class BinaryOp > (3) (since
T reduce( InputIt first, InputIt last, T init, C++17)
BinaryOp binary_op ); (until
C++20)
template< class InputIt, class T, class BinaryOp > (since
constexpr T reduce( InputIt first, InputIt last, T C++20)
init, BinaryOp binary_op ); (5)
template< class ExecutionPolicy, class ForwardIt,
class T, class BinaryOp >
(since
T reduce( ExecutionPolicy&& policy, (6) C++17)


ForwardIt first, ForwardIt last, T init, BinaryOp
binary_op );


1) same as reduce(first, last, typename std::iterator_traits<InputIt>::value_type{})
3) same as reduce(first, last, init, std::plus<>())
5) Reduces the range [first; last), possibly permuted and aggregated in unspecified
manner, along with the initial value init over binary_op.
2,4,6) Same as (1,3,5), but executed according to policy. These overloads do not
participate in overload resolution unless
std::is_execution_policy_v<std::decay_t<ExecutionPolicy>>
(until C++20)
std::is_execution_policy_v<std::remove_cvref_t<ExecutionPolicy>>
(since C++20) is true.


The behavior is non-deterministic if binary_op is not associative or not
commutative.


The behavior is undefined if binary_op modifies any element or invalidates any
iterator in [first; last], including the end iterator.


first, last - the range of elements to apply the algorithm to
init - the initial value of the generalized sum
policy - the execution policy to use. See execution policy for details.
binary FunctionObject that will be applied in unspecified order
binary_op - to the result of dereferencing the input iterators, the results
of other binary_op and init.


-
InputIt must meet the requirements of LegacyInputIterator.
-
ForwardIt must meet the requirements of LegacyForwardIterator.
-
T must meet the requirements of MoveConstructible. and binary_op(init, *first),
binary_op(*first, init), binary_op(init, init), and binary_op(*first, *first) must
be convertible to T.


Generalized sum of init and *first, *(first+1), ... *(last-1) over binary_op,


where generalized sum GSUM(op, a
1, ..., a
N) is defined as follows:


* if N=1, a
1
* if N > 1, op(GSUM(op, b
1, ..., b
K), GSUM(op, b
M, ..., b
N)) where


* b
1, ..., b
N may be any permutation of a1, ..., aN and
* 1 < K+1 = M ≤ N


in other words, reduce behaves like std::accumulate except the elements of the range
may be grouped and rearranged in arbitrary order


O(last - first) applications of binary_op.


The overloads with a template parameter named ExecutionPolicy report errors as
follows:


* If execution of a function invoked as part of the algorithm throws an exception
and ExecutionPolicy is one of the standard policies, std::terminate is called.
For any other ExecutionPolicy, the behavior is implementation-defined.
* If the algorithm fails to allocate memory, std::bad_alloc is thrown.


If the range is empty, init is returned, unmodified


side-by-side comparison between reduce and std::accumulate:

// Run this code


#include <chrono>
#include <execution>
#include <iomanip>
#include <iostream>
#include <numeric>
#include <utility>
#include <vector>


int main()
{
auto eval = [](auto fun) {
const auto t1 = std::chrono::high_resolution_clock::now();
const auto [name, result] = fun();
const auto t2 = std::chrono::high_resolution_clock::now();
const std::chrono::duration<double, std::milli> ms = t2 - t1;
std::cout << std::fixed << std::setprecision(1) << name << " result "
<< result << " took " << ms.count() << " ms\n";
};
{
const std::vector<double> v(100'000'007, 0.1);


eval([&v]{ return std::pair{"std::accumulate (double)",
std::accumulate(v.cbegin(), v.cend(), 0.0)}; } );
eval([&v]{ return std::pair{"std::reduce (seq, double)",
std::reduce(std::execution::seq, v.cbegin(), v.cend())}; } );
eval([&v]{ return std::pair{"std::reduce (par, double)",
std::reduce(std::execution::par, v.cbegin(), v.cend())}; } );
}{
const std::vector<long> v(100'000'007, 1);


eval([&v]{ return std::pair{"std::accumulate (long)",
std::accumulate(v.cbegin(), v.cend(), 0)}; } );
eval([&v]{ return std::pair{"std::reduce (seq, long)",
std::reduce(std::execution::seq, v.cbegin(), v.cend())}; } );
eval([&v]{ return std::pair{"std::reduce (par, long)",
std::reduce(std::execution::par, v.cbegin(), v.cend())}; } );
}
}


std::accumulate (double) result 10000000.7 took 163.6 ms
std::reduce (seq, double) result 10000000.7 took 162.9 ms
std::reduce (par, double) result 10000000.7 took 97.5 ms
std::accumulate (long) result 100000007 took 62.3 ms
std::reduce (seq, long) result 100000007 took 64.3 ms
std::reduce (par, long) result 100000007 took 49.0 ms


accumulate sums up a range of elements
(function template)
applies a function to a range of elements, storing results in a
transform destination range
(function template)
transform_reduce applies an invocable, then reduces out of order
(C++17) (function template)

2022.07.31 http://cppreference.com

Search for    or go to Top of page |  Section 3 |  Main Index

Powered by GSP Visit the GSP FreeBSD Man Page Interface.
Output converted with ManDoc.