| 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::forward_iterator I2,std::sentinel_for<I2> S2, | (1) | (since C++20) |
template<ranges::input_range R1,ranges::forward_range R2, class Pred=ranges::equal_to, | (2) | (since C++20) |
[first1, last1) forany of the elements in the range[first2, last2), after projecting the ranges withproj1 andproj2 respectively. The projected elements are compared using the binary predicatepred.The function-like entities described on this page arealgorithm function objects (informally known asniebloids), that is:
Contents |
| first1, last1 | - | the iterator-sentinel pair defining therange of elements to examine (akahaystack) |
| first2, last2 | - | the iterator-sentinel pair defining therange of elements to search for (akaneedles) |
| r1 | - | the range of elements to examine (akahaystack) |
| r2 | - | the range of elements to search for (akaneedles) |
| pred | - | binary predicate to compare the elements |
| proj1 | - | projection to apply to the elements in the first range |
| proj2 | - | projection to apply to the elements in the second range |
Iterator to the first element in the range[first1, last1) that is equal to an element from the range[first2, last2) after projection. If no such element is found, an iterator comparing equal tolast1 is returned.
At mostS* N applications of the predicate and each projection, where
(1)S=ranges::distance(first2, last2) andN=ranges::distance(first1, last1);
(2)S=ranges::distance(r2) andN=ranges::distance(r1).
struct find_first_of_fn{template<std::input_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>constexpr I1 operator()(I1 first1, S1 last1, I2 first2, S2 last2, Pred pred={}, Proj1 proj1={}, Proj2 proj2={})const{for(; first1!= last1;++first1)for(auto i= first2; i!= last2;++i)if(std::invoke(pred,std::invoke(proj1,*first1),std::invoke(proj2,*i)))return first1;return first1;} template<ranges::input_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>constexprranges::borrowed_iterator_t<R1> operator()(R1&& r1, R2&& r2, Pred pred={}, Proj1 proj1={}, Proj2 proj2={})const{return(*this)(ranges::begin(r1),ranges::end(r1),ranges::begin(r2),ranges::end(r2), std::move(pred), std::move(proj1), std::move(proj2));}}; inlineconstexpr find_first_of_fn find_first_of{}; |
#include <algorithm>#include <iostream>#include <iterator> int main(){namespace rng= std::ranges; constexprstaticauto haystack={1,2,3,4};constexprstaticauto needles={0,3,4,3}; constexprauto found1= rng::find_first_of(haystack.begin(), haystack.end(), needles.begin(), needles.end()); static_assert(std::distance(haystack.begin(), found1)==2); constexprauto found2= rng::find_first_of(haystack, needles); static_assert(std::distance(haystack.begin(), found2)==2); constexprstaticauto negatives={-6,-3,-4,-3};constexprauto not_found= rng::find_first_of(haystack, negatives); static_assert(not_found== haystack.end()); constexprauto found3= rng::find_first_of(haystack, negatives,[](int x,int y){return x==-y;});// uses a binary comparator static_assert(std::distance(haystack.begin(), found3)==2); struct P{int x, y;};constexprstaticauto p1={P{1,-1}, P{2,-2}, P{3,-3}, P{4,-4}};constexprstaticauto p2={P{5,-5}, P{6,-3}, P{7,-5}, P{8,-3}}; // Compare only P::y data members by projecting them:constauto found4= rng::find_first_of(p1, p2,{},&P::y,&P::y);std::cout<<"First equivalent element {"<< found4->x<<", "<< found4->y<<"} was found at position "<<std::distance(p1.begin(), found4)<<".\n";}
Output:
First equivalent element {3, -3} was found at position 2.| searches for any one of a set of elements (function template)[edit] | |
(C++20) | finds the first two adjacent items that are equal (or satisfy a given predicate) (algorithm function object)[edit] |
(C++20)(C++20)(C++20) | finds the first element satisfying specific criteria (algorithm function object)[edit] |
(C++20) | finds the last sequence of elements in a certain range (algorithm function object)[edit] |
(C++20) | searches for the first occurrence of a range of elements (algorithm function object)[edit] |
(C++20) | searches for the first occurrence of a number consecutive copies of an element in a range (algorithm function object)[edit] |