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 search( ForwardIt1 first, ForwardIt1 last, | (1) | (constexpr since C++20) |
template<class ExecutionPolicy,class ForwardIt1,class ForwardIt2> ForwardIt1 search( ExecutionPolicy&& policy, | (2) | (since C++17) |
template<class ForwardIt1,class ForwardIt2,class BinaryPred> ForwardIt1 search( ForwardIt1 first, ForwardIt1 last, | (3) | (constexpr since C++20) |
template<class ExecutionPolicy, class ForwardIt1,class ForwardIt2,class BinaryPred> | (4) | (since C++17) |
template<class ForwardIt,class Searcher> ForwardIt search( ForwardIt first, ForwardIt last, | (5) | (since C++17) (constexpr since C++20) |
[
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) |
[
first,
last)
for the pattern specified in the constructor ofsearcher.The standard library provides the following searchers:
| (since C++17) |
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 |
searcher | - | the searcher encapsulating the search algorithm and the pattern to look for |
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, ForwardIt2 must meet the requirements ofLegacyForwardIterator. | ||
-BinaryPred must meet the requirements ofBinaryPredicate. |
[
s_first,
s_last)
in the range[
first,
last)
. If no such occurrence is found,last is returned.[
s_first,
s_last)
is empty,first is returned.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.search (1) |
---|
template<class ForwardIt1,class ForwardIt2>constexpr//< since C++20ForwardIt1 search(ForwardIt1 first, ForwardIt1 last, ForwardIt2 s_first, ForwardIt2 s_last){while(true){ ForwardIt1 it= first;for(ForwardIt2 s_it= s_first;;++it,++s_it){if(s_it== s_last)return first;if(it== last)return last;if(!(*it==*s_it))break;}++first;}} |
search (3) |
template<class ForwardIt1,class ForwardIt2,class BinaryPred>constexpr//< since C++20ForwardIt1 search(ForwardIt1 first, ForwardIt1 last, ForwardIt2 s_first, ForwardIt2 s_last, BinaryPred p){while(true){ ForwardIt1 it= first;for(ForwardIt2 s_it= s_first;;++it,++s_it){if(s_it== s_last)return first;if(it== last)return last;if(!p(*it,*s_it))break;}++first;}} |
#include <algorithm>#include <cassert>#include <functional>#include <iomanip>#include <iostream>#include <iterator>#include <string_view>#include <vector> usingnamespace std::literals; bool contains(constauto& cont,std::string_view s){// str.find() (or str.contains(), since C++23) can be used as wellreturn std::search(cont.begin(), cont.end(), s.begin(), s.end())!= cont.end();} int main(){constauto str{"why waste time learning, when ignorance is instantaneous?"sv};assert(contains(str,"learning"));assert(not contains(str,"lemming")); conststd::vector vec(str.begin(), str.end());assert(contains(vec,"learning"));assert(not contains(vec,"leaning")); // The C++17 overload with searchers demo:constexprauto quote{"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed ""do eiusmod tempor incididunt ut labore et dolore magna aliqua"sv}; for(constauto word:{"pisci"sv,"Pisci"sv}){std::cout<<"The string "<<std::quoted(word)<<' ';conststd::boyer_moore_searcher searcher(word.begin(), word.end());constauto it= std::search(quote.begin(), quote.end(), searcher);if(it== quote.end())std::cout<<"not found\n";elsestd::cout<<"found at offset "<<std::distance(quote.begin(), it)<<'\n';}}
Output:
The string "pisci" found at offset 43The string "Pisci" 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 | returnsfirst in this case |
LWG 1338 | C++98 | the resolution ofLWG issue 1205 was incorrectly applied, makingfirst to be returned if no occurence is found | returnslast in this case |
LWG 2150 | C++98 | the condition of “sequence occurence” was incorrect | corrected |
finds the last sequence of elements in a certain range (function template)[edit] | |
returnstrue if one sequence is a subsequence of another (function template)[edit] | |
determines if two sets of elements are the same (function template)[edit] | |
(C++11) | finds the first element satisfying specific criteria (function template)[edit] |
returnstrue if one range is lexicographically less than another (function template)[edit] | |
finds the first position where two ranges differ (function template)[edit] | |
searches for the first occurrence of a number consecutive copies of an element in a range (function template)[edit] | |
(C++17) | standard C++ library search algorithm implementation (class template)[edit] |
(C++17) | Boyer-Moore search algorithm implementation (class template)[edit] |
Boyer-Moore-Horspool search algorithm implementation (class template)[edit] | |
(C++20) | searches for the first occurrence of a range of elements (algorithm function object)[edit] |