| 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] |