std:: search
|
Definiert in Header
<algorithm>
|
||
|
template
<
class
ForwardIt1,
class
ForwardIt2
>
ForwardIt1 search
(
ForwardIt1 first, ForwardIt1 last,
|
(1) | (constexpr seit C++20) |
|
template
<
class
ExecutionPolicy,
class
ForwardIt1,
class
ForwardIt2
>
ForwardIt1 search
(
ExecutionPolicy
&&
policy,
|
(2) | (seit C++17) |
|
template
<
class
ForwardIt1,
class
ForwardIt2,
class
BinaryPred
>
ForwardIt1 search
(
ForwardIt1 first, ForwardIt1 last,
|
(3) | (constexpr seit C++20) |
|
template
<
class
ExecutionPolicy,
class
ForwardIt1,
class
ForwardIt2,
class
BinaryPred
>
|
(4) | (seit C++17) |
|
template
<
class
ForwardIt,
class
Searcher
>
ForwardIt search
(
ForwardIt first, ForwardIt last,
|
(5) |
(seit C++17)
(constexpr seit C++20) |
[
s_first
,
s_last
)
im Bereich
[
first
,
last
)
.
|
std:: is_execution_policy_v < std:: decay_t < ExecutionPolicy >> ist true . |
(bis C++20) |
|
std:: is_execution_policy_v < std:: remove_cvref_t < ExecutionPolicy >> ist true . |
(seit C++20) |
[
first
,
last
)
nach dem im Konstruktor von
searcher
angegebenen Muster.
|
Die Standardbibliothek bietet folgende Searcher:
|
(seit C++17) |
Inhaltsverzeichnis |
Parameter
| first, last | - | das Paar von Iteratoren, das den Bereich der zu untersuchenden Elemente definiert |
| s_first, s_last | - | das Paar von Iteratoren, das den Bereich der zu suchenden Elemente definiert |
| policy | - | die zu verwendende Ausführungsrichtlinie |
| searcher | - | der Searcher, der den Suchalgorithmus und das zu suchende Muster kapselt |
| p | - |
binäres Prädikat, das
true
zurückgibt, wenn die Elemente als gleich behandelt werden sollen.
Die Signatur der Prädikatfunktion sollte äquivalent zu Folgendem sein: bool pred ( const Type1 & a, const Type2 & b ) ;
Obwohl die Signatur nicht
const
&
benötigt, darf die Funktion die übergebenen Objekte nicht modifizieren und muss alle Werte der Typen (möglicherweise const)
|
| Typanforderungen | ||
-
ForwardIt1, ForwardIt2
müssen die Anforderungen von
LegacyForwardIterator
erfüllen.
|
||
-
BinaryPred
müssen die Anforderungen von
BinaryPredicate
erfüllen.
|
||
Rückgabewert
[
s_first
,
s_last
)
im Bereich
[
first
,
last
)
. Wenn kein solches Vorkommen gefunden wird, wird
last
zurückgegeben.
[
s_first
,
s_last
)
leer ist,
first
wird zurückgegeben.
Komplexität
Ausnahmen
Die Überladungen mit einem Template-Parameter namens
ExecutionPolicy
melden Fehler wie folgt:
-
Wenn die Ausführung einer als Teil des Algorithmus aufgerufenen Funktion eine Exception wirft und
ExecutionPolicyeiner der Standard-Policies ist, wird std::terminate aufgerufen. Für jede andereExecutionPolicyist das Verhalten implementierungsdefiniert. - Wenn der Algorithmus keinen Speicher allokieren kann, wird std::bad_alloc geworfen.
Mögliche Implementierung
| search (1) |
|---|
template<class ForwardIt1, class ForwardIt2> constexpr //< since C++20 ForwardIt1 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++20 ForwardIt1 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; } } |
Beispiel
#include <algorithm> #include <cassert> #include <functional> #include <iomanip> #include <iostream> #include <iterator> #include <string_view> #include <vector> using namespace std::literals; bool contains(const auto& cont, std::string_view s) { // str.find() (oder str.contains(), seit C++23) kann ebenfalls verwendet werden return std::search(cont.begin(), cont.end(), s.begin(), s.end()) != cont.end(); } int main() { const auto str{"why waste time learning, when ignorance is instantaneous?"sv}; assert(contains(str, "learning")); assert(not contains(str, "lemming")); const std::vector vec(str.begin(), str.end()); assert(contains(vec, "learning")); assert(not contains(vec, "leaning")); // Demonstration der C++17-Überladung mit Suchern: constexpr auto quote { "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed " "do eiusmod tempor incididunt ut labore et dolore magna aliqua"sv }; for (const auto word : {"pisci"sv, "Pisci"sv}) { std::cout << "The string " << std::quoted(word) << ' '; const std::boyer_moore_searcher searcher(word.begin(), word.end()); const auto it = std::search(quote.begin(), quote.end(), searcher); if (it == quote.end()) std::cout << "not found\n"; else std::cout << "found at offset " << std::distance(quote.begin(), it) << '\n'; } }
Ausgabe:
The string "pisci" found at offset 43 The string "Pisci" not found
Fehlerberichte
Die folgenden verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.
| DR | Angewendet auf | Verhalten wie veröffentlicht | Korrektes Verhalten |
|---|---|---|---|
| LWG 1205 | C++98 |
der Rückgabewert war unklar, falls
[
s_first
,
s_last
)
leer ist
|
gibt in diesem Fall first zurück |
| LWG 1338 | C++98 |
die Lösung von
LWG Issue 1205
wurde falsch angewendet,
wodurch first zurückgegeben wurde, falls kein Vorkommen gefunden wurde |
gibt in diesem Fall last zurück |
| LWG 2150 | C++98 | die Bedingung für "Sequenzvorkommen" war inkorrekt | korrigiert |
Siehe auch
|
findet die letzte Sequenz von Elementen in einem bestimmten Bereich
(Funktions-Template) |
|
|
gibt
true
zurück, falls eine Sequenz eine Teilsequenz einer anderen ist
(Funktions-Template) |
|
|
bestimmt, ob zwei Elementmengen identisch sind
(Funktions-Template) |
|
|
(C++11)
|
findet das erste Element, das bestimmte Kriterien erfüllt
(Funktions-Template) |
|
gibt
true
zurück, falls ein Bereich lexikographisch kleiner als ein anderer ist
(Funktions-Template) |
|
|
findet die erste Position, an der zwei Bereiche sich unterscheiden
(Funktions-Template) |
|
|
sucht nach dem ersten Vorkommen einer Anzahl aufeinanderfolgender Kopien eines Elements in einem Bereich
(Funktions-Template) |
|
|
(C++17)
|
Implementierung des Standard-C++-Bibliothekssuchalgorithmus
(Klassen-Template) |
|
(C++17)
|
Implementierung des Boyer-Moore-Suchalgorithmus
(Klassen-Template) |
|
(C++17)
|
Implementierung des Boyer-Moore-Horspool-Suchalgorithmus
(Klassen-Template) |
|
(C++20)
|
sucht nach dem ersten Vorkommen eines Bereichs von Elementen
(Algorithmus-Funktionsobjekt) |