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::forward_iterator I,std::sentinel_for<I> S, class T,class Proj=std::identity, | (since C++20) (until C++26) | |
template<std::forward_iterator I,std::sentinel_for<I> S, class Proj=std::identity, | (since C++26) | |
(2) | ||
template<ranges::forward_range R, class T,class Proj=std::identity, | (since C++20) (until C++26) | |
template<ranges::forward_range R, class Proj=std::identity, | (since C++26) | |
[
first,
last)
.Forranges::binary_search
to succeed, the range[
first,
last)
must be at least partially ordered with respect tovalue, i.e. it must satisfy all of the following requirements:
A fully-sorted range meets these criteria.
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 elements to examine |
value | - | value to compare the elements to |
comp | - | comparison function to apply to the projected elements |
proj | - | projection to apply to the elements |
true if an element equal tovalue is found,false otherwise.
The number of comparisons and projections performed is logarithmic in the distance betweenfirst andlast (at mostlog2(last - first) + O(1) comparisons and projections). However, for iterator-sentinel pair that does not modelstd::random_access_iterator, number of iterator increments is linear.
std::ranges::binary_search
doesn't return an iterator to the found element when an element whose projection equalsvalue is found. If an iterator is desired,std::ranges::lower_bound should be used instead.
Feature-test macro | Value | Std | Feature |
---|---|---|---|
__cpp_lib_algorithm_default_value_type | 202403 | (C++26) | List-initialization for algorithms(1,2) |
struct binary_search_fn{template<std::forward_iterator I,std::sentinel_for<I> S,class Proj=std::identity,class T= std::projected_value_t<I, Proj>,std::indirect_strict_weak_order<const T*, std::projected<I, Proj>> Comp=ranges::less>constexprbool operator()(I first, S last,const T& value, Comp comp={}, Proj proj={})const{auto x=ranges::lower_bound(first, last, value, comp, proj);return(!(x== last)&&!(std::invoke(comp, value,std::invoke(proj,*x))));} template<ranges::forward_range R,class Proj=std::identity,class T= std::projected_value_t<ranges::iterator_t<R>, Proj>,std::indirect_strict_weak_order<const T*, std::projected<ranges::iterator_t<R>, Proj>> Comp=ranges::less>constexprbool operator()(R&& r,const T& value, Comp comp={}, Proj proj={})const{return(*this)(ranges::begin(r),ranges::end(r), value, std::move(comp), std::move(proj));}}; inlineconstexpr binary_search_fn binary_search; |
#include <algorithm>#include <cassert>#include <complex>#include <iostream>#include <ranges>#include <vector> int main(){constexprstaticauto haystack={1,3,4,5,9}; static_assert(std::ranges::is_sorted(haystack)); for(constint needle: std::views::iota(1)| std::views::take(3)){std::cout<<"Searching for "<< needle<<": "; std::ranges::binary_search(haystack, needle)?std::cout<<"found "<< needle<<'\n':std::cout<<"no dice!\n";} using CD=std::complex<double>;std::vector<CD> nums{{1,1},{2,3},{4,2},{4,3}};auto cmpz=[](CD x, CD y){return abs(x)< abs(y);};#ifdef __cpp_lib_algorithm_default_value_typeassert(std::ranges::binary_search(nums,{4,2}, cmpz));#elseassert(std::ranges::binary_search(nums, CD{4,2}, cmpz));#endif}
Output:
Searching for 1: found 1Searching for 2: no dice!Searching for 3: found 3
(C++20) | returns range of elements matching a specific key (algorithm function object)[edit] |
(C++20) | returns an iterator to the first elementnot less than the given value (algorithm function object)[edit] |
(C++20) | returns an iterator to the first elementgreater than a certain value (algorithm function object)[edit] |
(C++23)(C++23) | checks if the range contains the given element or subrange (algorithm function object)[edit] |
determines if an element exists in a partially-ordered range (function template)[edit] |