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, class Proj1=std::identity,class Proj2=std::identity, | (2) | (since C++20) |
Checks if the first range[
first1,
last1)
is lexicographicallyless than the second range[
first2,
last2)
.
Lexicographical comparison is an operation with the following properties:
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 examine |
r1 | - | the first range of elements to examine |
first2, last2 | - | the iterator-sentinel pair defining the secondrange of elements to examine |
r2 | - | the second range of elements to examine |
comp | - | comparison function to apply to the projected elements |
proj1 | - | projection to apply to the first range of elements |
proj2 | - | projection to apply to the second range of elements |
true if the first range is lexicographicallyless than the second.
At most2·min(N1, N2) applications of the comparison and corresponding projections, whereN1=ranges::distance(first1, last1) andN2=ranges::distance(first2, last2).
struct lexicographical_compare_fn{template<std::input_iterator I1,std::sentinel_for<I1> S1,std::input_iterator I2,std::sentinel_for<I2> S2,class Proj1=std::identity,class Proj2=std::identity,std::indirect_strict_weak_order< std::projected<I1, Proj1>, std::projected<I2, Proj2>> Comp=ranges::less>constexprbool operator()(I1 first1, S1 last1, I2 first2, S2 last2, Comp comp={}, Proj1 proj1={}, Proj2 proj2={})const{for(;(first1!= last1)&&(first2!= last2);++first1,(void)++first2){if(std::invoke(comp,std::invoke(proj1,*first1),std::invoke(proj2,*first2)))returntrue; if(std::invoke(comp,std::invoke(proj2,*first2),std::invoke(proj1,*first1)))returnfalse;}return(first1== last1)&&(first2!= last2);} template<ranges::input_range R1,ranges::input_range R2,class Proj1=std::identity,class Proj2=std::identity,std::indirect_strict_weak_order< std::projected<ranges::iterator_t<R1>, Proj1>, std::projected<ranges::iterator_t<R2>, Proj2>> Comp=ranges::less>constexprbool operator()(R1&& r1, R2&& r2, Comp comp={}, Proj1 proj1={}, Proj2 proj2={})const{return(*this)(ranges::begin(r1),ranges::end(r1),ranges::begin(r2),ranges::end(r2),std::ref(comp),std::ref(proj1),std::ref(proj2));}}; inlineconstexpr lexicographical_compare_fn lexicographical_compare; |
#include <algorithm>#include <iostream>#include <iterator>#include <random>#include <vector> int main(){std::vector<char> v1{'a','b','c','d'};std::vector<char> v2{'a','b','c','d'}; namespace ranges= std::ranges;auto os=std::ostream_iterator<char>(std::cout," "); std::mt19937 g{std::random_device{}()};while(not ranges::lexicographical_compare(v1, v2)){ranges::copy(v1, os);std::cout<<">= ";ranges::copy(v2, os);std::cout<<'\n'; ranges::shuffle(v1, g);ranges::shuffle(v2, g);} ranges::copy(v1, os);std::cout<<"< ";ranges::copy(v2, os);std::cout<<'\n';}
Possible output:
a b c d >= a b c dd a b c >= c b d ab d a c >= a d c ba c d b < c d a b
(C++20) | determines if two sets of elements are the same (algorithm function object)[edit] |
returnstrue if one range is lexicographically less than another (function template)[edit] |