| 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 I,std::sentinel_for<I> S, class Proj=std::identity, | (1) | (since C++20) |
template<ranges::input_range R,class Proj=std::identity, std::indirect_unary_predicate< | (2) | (since C++20) |
template<std::input_iterator I,std::sentinel_for<I> S, class Proj=std::identity, | (3) | (since C++20) |
template<ranges::input_range R,class Proj=std::identity, std::indirect_unary_predicate< | (4) | (since C++20) |
template<std::input_iterator I,std::sentinel_for<I> S, class Proj=std::identity, | (5) | (since C++20) |
template<ranges::input_range R,class Proj=std::identity, std::indirect_unary_predicate< | (6) | (since C++20) |
[first, last) (after projecting with the projectionproj).[first, last) (after projecting with the projectionproj).[first, last) (after projecting with the projectionproj).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 |
| pred | - | predicate to apply to the projected elements |
| proj | - | projection to apply to the elements |
| Range has sometrue element | Yes | No | ||
|---|---|---|---|---|
| Range has somefalse element | Yes | No | Yes | No[1] |
all_of | false | true | false | true |
any_of | true | true | false | false |
none_of | false | false | true | true |
At mostlast- first applications of the predicate and the projection.
| all_of (1,2) |
|---|
struct all_of_fn{template<std::input_iterator I,std::sentinel_for<I> S,class Proj=std::identity,std::indirect_unary_predicate<std::projected<I, Proj>> Pred>constexprbool operator()(I first, S last, Pred pred, Proj proj={})const{returnranges::find_if_not(first, last,std::ref(pred),std::ref(proj))== last;} template<ranges::input_range R,class Proj=std::identity,std::indirect_unary_predicate< std::projected<ranges::iterator_t<R>,Proj>> Pred>constexprbool operator()(R&& r, Pred pred, Proj proj={})const{return operator()(ranges::begin(r),ranges::end(r),std::ref(pred),std::ref(proj));}}; inlineconstexpr all_of_fn all_of; |
| any_of (3,4) |
struct any_of_fn{template<std::input_iterator I,std::sentinel_for<I> S,class Proj=std::identity,std::indirect_unary_predicate<std::projected<I, Proj>> Pred>constexprbool operator()(I first, S last, Pred pred, Proj proj={})const{returnranges::find_if(first, last,std::ref(pred),std::ref(proj))!= last;} template<ranges::input_range R,class Proj=std::identity,std::indirect_unary_predicate< std::projected<ranges::iterator_t<R>,Proj>> Pred>constexprbool operator()(R&& r, Pred pred, Proj proj={})const{return operator()(ranges::begin(r),ranges::end(r),std::ref(pred),std::ref(proj));}}; inlineconstexpr any_of_fn any_of; |
| none_of (5,6) |
struct none_of_fn{template<std::input_iterator I,std::sentinel_for<I> S,class Proj=std::identity,std::indirect_unary_predicate<std::projected<I, Proj>> Pred>constexprbool operator()(I first, S last, Pred pred, Proj proj={})const{returnranges::find_if(first, last,std::ref(pred),std::ref(proj))== last;} template<ranges::input_range R,class Proj=std::identity,std::indirect_unary_predicate< std::projected<ranges::iterator_t<R>,Proj>> Pred>constexprbool operator()(R&& r, Pred pred, Proj proj={})const{return operator()(ranges::begin(r),ranges::end(r),std::ref(pred),std::ref(proj));}}; inlineconstexpr none_of_fn none_of; |
#include <algorithm>#include <functional>#include <iostream>#include <iterator>#include <numeric>#include <vector> namespace ranges= std::ranges; constexprbool some_of(auto&& r,auto&& pred)// some but not all{return not(ranges::all_of(r, pred) orranges::none_of(r, pred));} constexprauto w={1,2,3};static_assert(!some_of(w,[](int x){return x<1;}));static_assert( some_of(w,[](int x){return x<2;}));static_assert(!some_of(w,[](int x){return x<4;})); int main(){std::vector<int> v(10,2);std::partial_sum(v.cbegin(), v.cend(), v.begin());std::cout<<"Among the numbers: ";ranges::copy(v,std::ostream_iterator<int>(std::cout," "));std::cout<<'\n'; if(ranges::all_of(v.cbegin(), v.cend(),[](int i){return i%2==0;}))std::cout<<"All numbers are even\n"; if(ranges::none_of(v,std::bind(std::modulus<int>(), std::placeholders::_1,2)))std::cout<<"None of them are odd\n"; auto DivisibleBy=[](int d){return[d](int m){return m% d==0;};}; if(ranges::any_of(v, DivisibleBy(7)))std::cout<<"At least one number is divisible by 7\n";}
Output:
Among the numbers: 2 4 6 8 10 12 14 16 18 20All numbers are evenNone of them are oddAt least one number is divisible by 7
(C++11)(C++11)(C++11) | checks if a predicate istrue for all, any or none of the elements in a range (function template)[edit] |