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 | ||
(1) | ||
template<std::input_iterator I,std::sentinel_for<I> S, class T, | (since C++23) (until C++26) | |
template<std::input_iterator I,std::sentinel_for<I> S, class Proj=std::identity, | (since C++26) | |
(2) | ||
template<ranges::input_range R, class T, | (since C++23) (until C++26) | |
template<ranges::input_range R, class Proj=std::identity, | (since C++26) | |
template<std::forward_iterator I1,std::sentinel_for<I1> S1, std::forward_iterator I2,std::sentinel_for<I2> S2, | (3) | (since C++23) |
template<ranges::forward_range R1,ranges::forward_range R2, class Pred=ranges::equal_to, | (4) | (since C++23) |
[
first,
last)
.[
ranges::begin(r),
ranges::end(r))
.[
first1,
last1)
, and the second source range is[
first2,
last2)
.[
ranges::begin(r1),
ranges::end(r1))
, and the second source range is[
ranges::begin(r2),
ranges::end(r2))
.The function-like entities described on this page arealgorithm function objects (informally known asniebloids), that is:
Contents |
first, last | - | the iterator-sentinel pair defining therange of elements to examine |
r | - | the range of the elements to examine |
value | - | value to compare the elements to |
pred | - | predicate to apply to the projected elements |
proj | - | projection to apply to the elements |
In C++20, one may implement acontains function withranges::find(haystack, needle)!=ranges::end(haystack) orcontains_subrange with!ranges::search(haystack, needle).empty().
ranges::contains_subrange
, likeranges::search, and unlikestd::search, has no support forsearchers (such asstd::boyer_moore_searcher).
Feature-test macro | Value | Std | Feature |
---|---|---|---|
__cpp_lib_ranges_contains | 202207L | (C++23) | ranges::contains andranges::contains_subrange |
__cpp_lib_algorithm_default_value_type | 202403L | (C++26) | List-initialization for algorithms(1,2) |
contains (1,2) |
---|
struct __contains_fn{template<std::input_iterator I,std::sentinel_for<I> S,class Proj=std::identity,class T= std::projected_value_t<I, Proj>> requiresstd::indirect_binary_predicate<ranges::equal_to, std::projected<I, Proj>,const T*>constexprbool operator()(I first, S last,const T& value, Proj proj={})const{returnranges::find(std::move(first), last, value, proj)!= last;} template<ranges::input_range R,class Proj=std::identity,class T= std::projected_value_t<ranges::iterator_t<R>, Proj>> requiresstd::indirect_binary_predicate<ranges::equal_to, std::projected<ranges::iterator_t<R>, Proj>,const T*>constexprbool operator()(R&& r,const T& value, Proj proj={})const{returnranges::find(std::move(ranges::begin(r)),ranges::end(r), value, proj)!=ranges::end(r);}}; inlineconstexpr __contains_fn contains{}; |
contains_subrange (3,4) |
struct __contains_subrange_fn{template<std::forward_iterator I1,std::sentinel_for<I1> S1,std::forward_iterator I2,std::sentinel_for<I2> S2,class Pred=ranges::equal_to,class Proj1=std::identity,class Proj2=std::identity> requiresstd::indirectly_comparable<I1, I2, Pred, Proj1, Proj2>constexprbool operator()(I1 first1, S1 last1, I2 first2, S2 last2, Pred pred={}, Proj1 proj1={}, Proj2 proj2={})const{return(first2== last2)||!ranges::search(first1, last1, first2, last2, pred, proj1, proj2).empty();} template<ranges::forward_range R1,ranges::forward_range R2,class Pred=ranges::equal_to,class Proj1=std::identity,class Proj2=std::identity> requiresstd::indirectly_comparable<ranges::iterator_t<R1>,ranges::iterator_t<R2>, Pred, Proj1, Proj2>constexprbool operator()(R1&& r1, R2&& r2, Pred pred={}, Proj1 proj1={}, Proj2 proj2={})const{return(first2== last2)||!ranges::search(ranges::begin(r1),ranges::end(r1),ranges::begin(r2),ranges::end(r2), pred, proj1, proj2).empty();}}; inlineconstexpr __contains_subrange_fn contains_subrange{}; |
#include <algorithm>#include <array>#include <complex> namespace ranges= std::ranges; int main(){constexprauto haystack=std::array{3,1,4,1,5};constexprauto needle=std::array{1,4,1};constexprauto bodkin=std::array{2,5,2}; static_assert( ranges::contains(haystack,4)&&!ranges::contains(haystack,6)&& ranges::contains_subrange(haystack, needle)&&!ranges::contains_subrange(haystack, bodkin)); constexprstd::array<std::complex<double>,3> nums{{{1,2},{3,4},{5,6}}};#ifdef __cpp_lib_algorithm_default_value_type static_assert(ranges::contains(nums,{3,4}));#else static_assert(ranges::contains(nums,std::complex<double>{3,4}));#endif}
(C++20)(C++20)(C++20) | finds the first element satisfying specific criteria (algorithm function object)[edit] |
(C++20) | searches for the first occurrence of a range of elements (algorithm function object)[edit] |
(C++20) | determines if an element exists in a partially-ordered range (algorithm function object)[edit] |
(C++20) | returnstrue if one sequence is a subsequence of another (algorithm function object)[edit] |
(C++20)(C++20)(C++20) | checks if a predicate istrue for all, any or none of the elements in a range (algorithm function object)[edit] |