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