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::input_iterator I1,std::sentinel_for<I1> S1, std::input_iterator I2,std::sentinel_for<I2> S2> | (1) | (since C++20) |
template<ranges::input_range R1,ranges::input_range R2> requiresstd::indirectly_swappable<ranges::iterator_t<R1>,ranges::iterator_t<R2>> | (2) | (since C++20) |
Helper types | ||
template<class I1,class I2> using swap_ranges_result=ranges::in_in_result<I1, I2>; | (3) | (since C++20) |
[
first1,
first1+ M)
and second range[
first2,
first2+ M)
viaranges::iter_swap(first1+ i, first2+ i), whereM=ranges::min(ranges::distance(first1, last1),ranges::distance(first2, last2)).[
first1,
last1)
and[
first2,
last2)
must not overlap.The function-like entities described on this page arealgorithm function objects (informally known asniebloids), that is:
Contents |
first1, last1 | - | the iterator-sentinel pair defining the firstrange of elements to swap |
first2, last2 | - | the iterator-sentinel pair defining the secondrange of elements to swap |
r1 | - | the first range of elements to swap |
r2 | - | the second range of elements to swap. |
{first1+ M, first2+ M}.
ExactlyM swaps.
Implementations (e.g.MSVC STL) may enable vectorization when the iterator type modelscontiguous_iterator
and swapping its value type calls neither non-trivial special member function norADL-foundswap
.
struct swap_ranges_fn{template<std::input_iterator I1,std::sentinel_for<I1> S1,std::input_iterator I2,std::sentinel_for<I2> S2> requiresstd::indirectly_swappable<I1, I2>constexpr ranges::swap_ranges_result<I1, I2> operator()(I1 first1, S1 last1, I2 first2, S2 last2)const{for(;!(first1== last1 or first2== last2);++first1,++first2)ranges::iter_swap(first1, first2);return{std::move(first1), std::move(first2)};} template<ranges::input_range R1,ranges::input_range R2> requiresstd::indirectly_swappable<ranges::iterator_t<R1>,ranges::iterator_t<R2>>constexpr ranges::swap_ranges_result<ranges::borrowed_iterator_t<R1>,ranges::borrowed_iterator_t<R2>> operator()(R1&& r1, R2&& r2)const{return(*this)(ranges::begin(r1),ranges::end(r1),ranges::begin(r2),ranges::end(r2));}}; inlineconstexpr swap_ranges_fn swap_ranges{}; |
#include <algorithm>#include <iostream>#include <list>#include <string_view>#include <vector> auto print(std::string_view name,autoconst& seq,std::string_view term="\n"){std::cout<< name<<" : ";for(constauto& elem: seq)std::cout<< elem<<' ';std::cout<< term;} int main(){std::vector<char> p{'A','B','C','D','E'};std::list<char> q{'1','2','3','4','5','6'}; print("p", p); print("q", q,"\n\n"); // swap p[0, 2) and q[1, 3): std::ranges::swap_ranges(p.begin(), p.begin()+4, std::ranges::next(q.begin(),1), std::ranges::next(q.begin(),3)); print("p", p); print("q", q,"\n\n"); // swap p[0, 5) and q[0, 5): std::ranges::swap_ranges(p, q); print("p", p); print("q", q);}
Output:
p : A B C D Eq : 1 2 3 4 5 6 p : 2 3 C D Eq : 1 A B 4 5 6 p : 1 A B 4 5q : 2 3 C D E 6
(C++20) | swaps the values referenced by two dereferenceable objects (customization point object)[edit] |
(C++20) | swaps the values of two objects (customization point object)[edit] |
swaps two ranges of elements (function template)[edit] | |
swaps the elements pointed to by two iterators (function template)[edit] | |
swaps the values of two objects (function template)[edit] |