std:: find_end
|
Definiert im Header
<algorithm>
|
||
|
template
<
class
ForwardIt1,
class
ForwardIt2
>
ForwardIt1 find_end
(
ForwardIt1 first, ForwardIt1 last,
|
(1) | (constexpr seit C++20) |
|
template
<
class
ExecutionPolicy,
class
ForwardIt1,
class
ForwardIt2
>
ForwardIt1 find_end
(
ExecutionPolicy
&&
policy,
|
(2) | (seit C++17) |
|
template
<
class
ForwardIt1,
class
ForwardIt2,
class
BinaryPred
>
ForwardIt1 find_end
(
ForwardIt1 first, ForwardIt1 last,
|
(3) | (constexpr seit C++20) |
|
template
<
class
ExecutionPolicy,
class
ForwardIt1,
class
ForwardIt2,
class
BinaryPred
>
|
(4) | (seit C++17) |
Sucht nach dem letzten Vorkommen der Sequenz
[
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) |
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 |
| 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
muss die Anforderungen von
LegacyForwardIterator
erfüllen.
|
||
-
ForwardIt2
muss die Anforderungen von
LegacyForwardIterator
erfüllen.
|
||
Rückgabewert
Iterator zum Anfang des letzten Vorkommens der Sequenz
[
s_first
,
s_last
)
im Bereich
[
first
,
last
)
.
Wenn
[
s_first
,
s_last
)
leer ist oder wenn keine solche Sequenz gefunden wird,
wird
last
zurückgegeben.
Komplexität
Gegeben N als std:: distance ( first, last ) und S als std:: distance ( s_first, s_last ) :
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 allozieren kann, wird std::bad_alloc geworfen.
Mögliche Implementierung
| find_end (1) |
|---|
template<class ForwardIt1, class ForwardIt2> constexpr //< seit C++20 ForwardIt1 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 //< seit C++20 ForwardIt1 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; } |
Beispiel
#include <algorithm> #include <array> #include <cmath> #include <iostream> auto print_result = [](auto result, const auto& v) { result == v.end() ? std::cout << "Sequence not found\n" : std::cout << "Last occurrence is at: " << std::distance(v.begin(), result) << '\n'; }; int main() { const auto v = {1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4}; for (auto const& 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 (auto const& 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); } }
Ausgabe:
Last occurrence is at: 8 Sequence not found Last occurrence is at: 8 Sequence 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 last zurück |
| LWG 2150 | C++98 | die Bedingung für "Sequenzvorkommen" war inkorrekt | korrigiert |
Siehe auch
|
sucht nach dem ersten Auftreten eines Elementbereichs
(Funktions-Template) |
|
|
gibt
true
zurück, wenn eine Sequenz eine Teilsequenz einer anderen ist
(Funktions-Template) |
|
|
findet die ersten zwei benachbarten Elemente, die gleich sind (oder ein gegebenes Prädikat erfüllen)
(Funktions-Template) |
|
|
(C++11)
|
findet das erste Element, das bestimmte Kriterien erfüllt
(Funktions-Template) |
|
sucht nach einem beliebigen Element aus einer Menge von Elementen
(Funktions-Template) |
|
|
sucht nach dem ersten Auftreten einer Anzahl aufeinanderfolgender Kopien eines Elements in einem Bereich
(Funktions-Template) |
|
|
(C++20)
|
findet die letzte Sequenz von Elementen in einem bestimmten Bereich
(Algorithmus-Funktionsobjekt) |