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 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Defined in header <algorithm> | ||
template<class InputIt,class ForwardIt> InputIt find_first_of( InputIt first, InputIt last, | (1) | (constexpr since C++20) |
template<class ExecutionPolicy,class ForwardIt1,class ForwardIt2> ForwardIt1 find_first_of( ExecutionPolicy&& policy, | (2) | (since C++17) |
template<class InputIt,class ForwardIt,class BinaryPred> InputIt find_first_of( InputIt first, InputIt last, | (3) | (constexpr since C++20) |
template<class ExecutionPolicy, class ForwardIt1,class ForwardIt2,class BinaryPred> | (4) | (since C++17) |
Searches the range[
first,
last)
for any of the elements in the range[
s_first,
s_last)
.
std::is_execution_policy_v<std::decay_t<ExecutionPolicy>> istrue. | (until C++20) |
std::is_execution_policy_v<std::remove_cvref_t<ExecutionPolicy>> istrue. | (since C++20) |
Contents |
first, last | - | the pair of iterators defining therange of elements to examine |
s_first, s_last | - | the pair of iterators defining therange of elements to search for |
policy | - | theexecution policy to use |
p | - | binary predicate which returns true if the elements should be treated as equal. The signature of the predicate function should be equivalent to the following: bool pred(const Type1&a,const Type2&b); While the signature does not need to haveconst&, the function must not modify the objects passed to it and must be able to accept all values of type (possibly const) |
Type requirements | ||
-InputIt must meet the requirements ofLegacyInputIterator. | ||
-ForwardIt must meet the requirements ofLegacyForwardIterator. | ||
-ForwardIt1 must meet the requirements ofLegacyForwardIterator. | ||
-ForwardIt2 must meet the requirements ofLegacyForwardIterator. | ||
-BinaryPred must meet the requirements ofBinaryPredicate. |
Iterator to the first element in the range[
first,
last)
that is equal to an element from the range[
s_first,
s_last)
.
If[
s_first,
s_last)
is empty or if no such element is found,last is returned.
Given\(\scriptsize N\)N asstd::distance(first, last) and\(\scriptsize S\)S asstd::distance(s_first, s_last):
The overloads with a template parameter namedExecutionPolicy
report errors as follows:
ExecutionPolicy
is one of thestandard policies,std::terminate is called. For any otherExecutionPolicy
, the behavior is implementation-defined.find_first_of (1) |
---|
template<class InputIt,class ForwardIt>InputIt find_first_of(InputIt first, InputIt last, ForwardIt s_first, ForwardIt s_last){for(; first!= last;++first)for(ForwardIt it= s_first; it!= s_last;++it)if(*first==*it)return first;return last;} |
find_first_of (3) |
template<class InputIt,class ForwardIt,class BinaryPred>InputIt find_first_of(InputIt first, InputIt last, ForwardIt s_first, ForwardIt s_last, BinaryPred p){for(; first!= last;++first)for(ForwardIt it= s_first; it!= s_last;++it)if(p(*first,*it))return first;return last;} |
The following code searches for any of specified integers in a vector of integers:
#include <algorithm>#include <iostream>#include <vector> auto print_sequence=[](constauto id,constauto& seq,int pos=-1){std::cout<< id<<"{ ";for(int i{};autoconst& e: seq){constbool mark{i== pos};std::cout<<(i++?", ":"");std::cout<<(mark?"[ ":"")<< e<<(mark?" ]":"");}std::cout<<" }\n";}; int main(){conststd::vector<int> v{0,2,3,25,5};constauto t1={19,10,3,4};constauto t2={1,6,7,9}; auto find_any_of=[](constauto& v,constauto& t){constauto result= std::find_first_of(v.begin(), v.end(), t.begin(), t.end());if(result== v.end()){std::cout<<"No elements of v are equal to any element of "; print_sequence("t = ", t); print_sequence("v = ", v);}else{constauto pos=std::distance(v.begin(), result);std::cout<<"Found a match ("<<*result<<") at position "<< pos; print_sequence(", where t = ", t); print_sequence("v = ", v, pos);}}; find_any_of(v, t1); find_any_of(v, t2);}
Output:
Found a match (3) at position 2, where t = { 19, 10, 3, 4 }v = { 0, 2, [ 3 ], 25, 5 }No elements of v are equal to any element of t = { 1, 6, 7, 9 }v = { 0, 2, 3, 25, 5 }
The following behavior-changing defect reports were applied retroactively to previously published C++ standards.
DR | Applied to | Behavior as published | Correct behavior |
---|---|---|---|
LWG 576 | C++98 | first andlast needed to beLegacyForwardIterators | they only need to be LegacyInputIterators |
LWG 1205 | C++98 | the return value was unclear if[ s_first, s_last) is empty | returnslast in this case |
(C++11) | finds the first element satisfying specific criteria (function template)[edit] |
(C++20) | searches for any one of a set of elements (algorithm function object)[edit] |