Constrained algorithms and algorithms on ranges(C++20) | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Constrained algorithms, e.g.ranges::copy,ranges::sort, ... | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Execution policies(C++17) | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Numeric operations | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Operations on uninitialized memory | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
std::ranges
Non-modifying sequence operations | |||||||||||||||||||||||||||||||||
Modifying sequence operations | |||||||||||||||||||||||||||||||||
Partitioning operations | |||||||||||||||||||||||||||||||||
Sorting operations | |||||||||||||||||||||||||||||||||
Binary search operations (on sorted ranges) | |||||||||||||||||||||||||||||||||
Set operations (on sorted ranges) | |||||||||||||||||||||||||||||||||
Heap operations | |||||||||||||||||||||||||||||||||
Minimum/maximum operations | |||||||||||||||||||||||||||||||||
Permutation operations | |||||||||||||||||||||||||||||||||
Fold operations | |||||||||||||||||||||||||||||||||
| |||||||||||||||||||||||||||||||||
Operations on uninitialized storage | |||||||||||||||||||||||||||||||||
Return types | |||||||||||||||||||||||||||||||||
Defined in header <algorithm> | ||
Call signature | ||
template<std::bidirectional_iterator I,std::sentinel_for<I> S, std::weakly_incrementable O> | (1) | (since C++20) |
template<ranges::bidirectional_range R,std::weakly_incrementable O> requiresstd::indirectly_copyable<ranges::iterator_t<R>, O> | (2) | (since C++20) |
Helper types | ||
template<class I,class O> using reverse_copy_result=ranges::in_out_result<I, O>; | (3) | (since C++20) |
[
first,
last)
to the destination range[
result,
result+ N)
, whereN
isranges::distance(first, last), in such a way that the elements in the new range are in reverse order. Behaves as if by executing the assignment*(result+ N-1- i)=*(first+ i) once for each integeri
in[
0,
N)
. The behavior is undefined if the source and destination ranges overlap.The function-like entities described on this page arealgorithm function objects (informally known asniebloids), that is:
Contents |
first, last | - | the iterator-sentinel pair defining the sourcerange of elements to copy |
r | - | the source range of elements to copy |
result | - | the beginning of the destination range. |
{last, result+ N}.
ExactlyN
assignments.
Implementations (e.g.MSVC STL) may enable vectorization when the both iterator types modelcontiguous_iterator
and have the same value type, and the value type isTriviallyCopyable.
See also the implementations inMSVC STL andlibstdc++.
struct reverse_copy_fn{template<std::bidirectional_iterator I,std::sentinel_for<I> S,std::weakly_incrementable O> requiresstd::indirectly_copyable<I, O>constexpr ranges::reverse_copy_result<I, O> operator()(I first, S last, O result)const{auto ret=ranges::next(first, last);for(; last!= first;*result=*--last,++result);return{std::move(ret), std::move(result)};} template<ranges::bidirectional_range R,std::weakly_incrementable O> requiresstd::indirectly_copyable<ranges::iterator_t<R>, O>constexpr ranges::reverse_copy_result<ranges::borrowed_iterator_t<R>, O> operator()(R&& r, O result)const{return(*this)(ranges::begin(r),ranges::end(r), std::move(result));}}; inlineconstexpr reverse_copy_fn reverse_copy{}; |
#include <algorithm>#include <iostream>#include <string> int main(){std::string x{"12345"}, y(x.size(),' ');std::cout<< x<<" → "; std::ranges::reverse_copy(x.begin(), x.end(), y.begin());std::cout<< y<<" → "; std::ranges::reverse_copy(y, x.begin());std::cout<< x<<'\n';}
Output:
12345 → 54321 → 12345
(C++20) | reverses the order of elements in a range (algorithm function object)[edit] |
creates a copy of a range that is reversed (function template)[edit] |