typename std::iterator_traits<InputIt>::value_type
typename std::iterator_traits<ForwardIt>::value_type
reduce( ExecutionPolicy&& policy,
template< class InputIt, class T >
T reduce( InputIt first, InputIt last, T init );
T reduce( ExecutionPolicy&& policy,
template< class InputIt, class T, class BinaryOp >
T reduce( InputIt first, InputIt last, T init, BinaryOp op );
class ForwardIt, class T, class BinaryOp >
T reduce( ExecutionPolicy&& policy,
Equivalent to
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 op.
2,4,6) Same as (1,3,5), but executed according to policy.
These overloads participate in overload resolution only if all following conditions are satisfied:
Given binary_op as the actual binary operation:
T
, the program is ill-formed:T
is not MoveConstructible.[
first,
last)
.[
first,
last]
.InputIt
must meet the requirements of LegacyInputIterator. -ForwardIt
must meet the requirements of LegacyForwardIterator. [edit] Return value 1-4)
The generalized sum of
initand the elements of
[
first,
last)
over
std::plus<>().
5,6) The generalized sum of init and the elements of [
first,
last)
over op.
The generalized sum of a group of elements over an binary operation binary_op is defined as follows:
Given \(\scriptsize N\)N as std::distance(first, last):
1-4) \(\scriptsize O(N)\)O(N)applications of
std::plus<>().
5,6) \(\scriptsize O(N)\)O(N) applications of op.
[edit] ExceptionsThe overloads with a template parameter named ExecutionPolicy
report errors as follows:
ExecutionPolicy
is one of the standard policies, std::terminate is called. For any other ExecutionPolicy
, the behavior is implementation-defined.std::reduce
behaves like std::accumulate except the elements of the range may be grouped and rearranged in arbitrary order.
Side-by-side comparison between std::reduce
and std::accumulate:
#if PARALLEL #include <execution> #define SEQ std::execution::seq, #define PAR std::execution::par, #else #define SEQ #define PAR #endif #include <chrono> #include <iomanip> #include <iostream> #include <locale> #include <numeric> #include <utility> #include <vector> int main() { std::cout.imbue(std::locale("en_US.UTF-8")); std::cout << std::fixed << std::setprecision(1); 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::setw(28) << std::left << name << "sum: " << result << '\t' << "time: " << 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(SEQ v.cbegin(), v.cend())}; }); eval([&v]{ return std::pair{"std::reduce (par, double)", std::reduce(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(), 0l)}; }); eval([&v]{ return std::pair{"std::reduce (seq, long)", std::reduce(SEQ v.cbegin(), v.cend())}; }); eval([&v]{ return std::pair{"std::reduce (par, long)", std::reduce(PAR v.cbegin(), v.cend())}; }); } }
Possible output:
// POSIX: g++ -std=c++23 ./example.cpp -ltbb -O3; ./a.out std::accumulate (double) sum: 10,000,000.7 time: 356.9 ms std::reduce (seq, double) sum: 10,000,000.7 time: 140.1 ms std::reduce (par, double) sum: 10,000,000.7 time: 140.1 ms std::accumulate (long) sum: 100,000,007 time: 46.0 ms std::reduce (seq, long) sum: 100,000,007 time: 67.3 ms std::reduce (par, long) sum: 100,000,007 time: 63.3 ms // POSIX: g++ -std=c++23 ./example.cpp -ltbb -O3 -DPARALLEL; ./a.out std::accumulate (double) sum: 10,000,000.7 time: 353.4 ms std::reduce (seq, double) sum: 10,000,000.7 time: 140.7 ms std::reduce (par, double) sum: 10,000,000.7 time: 24.7 ms std::accumulate (long) sum: 100,000,007 time: 42.4 ms std::reduce (seq, long) sum: 100,000,007 time: 52.0 ms std::reduce (par, long) sum: 100,000,007 time: 23.1 ms[edit] See also sums up or folds a range of elements
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4