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 ForwardIt1,class ForwardIt2> ForwardIt1 find_end( ForwardIt1 first, ForwardIt1 last, | (1) | (constexpr since C++20) |
template<class ExecutionPolicy,class ForwardIt1,class ForwardIt2> ForwardIt1 find_end( ExecutionPolicy&& policy, | (2) | (since C++17) |
template<class ForwardIt1,class ForwardIt2,class BinaryPred> ForwardIt1 find_end( ForwardIt1 first, ForwardIt1 last, | (3) | (constexpr since C++20) |
template<class ExecutionPolicy, class ForwardIt1,class ForwardIt2,class BinaryPred> | (4) | (since C++17) |
Searches for the last occurrence of the sequence[
s_first,
s_last)
in the range[
first,
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 | ||
-ForwardIt1 must meet the requirements ofLegacyForwardIterator. | ||
-ForwardIt2 must meet the requirements ofLegacyForwardIterator. |
Iterator to the beginning of last occurrence of the sequence[
s_first,
s_last)
in range[
first,
last)
.
If[
s_first,
s_last)
is empty or if no such sequence 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_end (1) |
---|
template<class ForwardIt1,class ForwardIt2>constexpr//< since C++20ForwardIt1 find_end(ForwardIt1 first, ForwardIt1 last, ForwardIt2 s_first, ForwardIt2 s_last){if(s_first== s_last)return last; ForwardIt1 result= last;while(true){ ForwardIt1 new_result=std::search(first, last, s_first, s_last);if(new_result== last)break;else{ result= new_result; first= result;++first;}}return result;} |
find_end (3) |
template<class ForwardIt1,class ForwardIt2,class BinaryPred>constexpr//< since C++20ForwardIt1 find_end(ForwardIt1 first, ForwardIt1 last, ForwardIt2 s_first, ForwardIt2 s_last, BinaryPred p){if(s_first== s_last)return last; ForwardIt1 result= last;while(true){ ForwardIt1 new_result=std::search(first, last, s_first, s_last, p);if(new_result== last)break;else{ result= new_result; first= result;++first;}}return result;} |
#include <algorithm>#include <array>#include <cmath>#include <iostream> auto print_result=[](auto result,constauto& v){ result== v.end()?std::cout<<"Sequence not found\n":std::cout<<"Last occurrence is at: "<<std::distance(v.begin(), result)<<'\n';}; int main(){constauto v={1,2,3,4,1,2,3,4,1,2,3,4}; for(autoconst& x:{std::array{1,2,3},{4,5,6}}){auto iter= std::find_end(v.begin(), v.end(), x.begin(), x.end());// overload (1) print_result(iter, v);} for(autoconst& x:{std::array{-1,-2,-3},{-4,-5,-6}}){auto iter= std::find_end(v.begin(), v.end(), x.begin(), x.end(),// overload (3)[](int x,int y){return std::abs(x)== std::abs(y);}); print_result(iter, v);}}
Output:
Last occurrence is at: 8Sequence not foundLast occurrence is at: 8Sequence not found
The following behavior-changing defect reports were applied retroactively to previously published C++ standards.
DR | Applied to | Behavior as published | Correct behavior |
---|---|---|---|
LWG 1205 | C++98 | the return value was unclear if[ s_first, s_last) is empty | returnslast in this case |
LWG 2150 | C++98 | the condition of “sequence occurence” was incorrect | corrected |
searches for the first occurrence of a range of elements (function template)[edit] | |
returnstrue if one sequence is a subsequence of another (function template)[edit] | |
finds the first two adjacent items that are equal (or satisfy a given predicate) (function template)[edit] | |
(C++11) | finds the first element satisfying specific criteria (function template)[edit] |
searches for any one of a set of elements (function template)[edit] | |
searches for the first occurrence of a number consecutive copies of an element in a range (function template)[edit] | |
(C++20) | finds the last sequence of elements in a certain range (algorithm function object)[edit] |