std::adjacent_find
| Definiert in Header <algorithm>
|
||
template< class ForwardIt >
ForwardIt adjacent_find( ForwardIt first, ForwardIt last );
|
(1) | (constexpr seit C++20) |
template< class ForwardIt, class BinaryPred >
ForwardIt adjacent_find( ForwardIt first, ForwardIt last,
BinaryPred p );
|
(2) | (constexpr seit C++20) |
template< class ExecutionPolicy, class ForwardIt >
ForwardIt adjacent_find( ExecutionPolicy&& policy,
ForwardIt first, ForwardIt last );
|
(3) | (seit C++17) |
template< class ExecutionPolicy, class ForwardIt, class BinaryPred >
ForwardIt adjacent_find( ExecutionPolicy&& policy,
ForwardIt first, ForwardIt last,
BinaryPred p );
|
(4) | (seit C++17) |
Durchsucht den Quellbereich [first, last) nach dem ersten Paar benachbarter Elemente, das die angegebene Bedingung erfüllt.
operator== bestimmt.p erfüllen.policy.true ist:
|
|
(bis C++20) |
|
|
(seit C++20) |
Parameter
| first, last | - | das Iteratorpaar, das den Quellbereich |
| definiertp | - | binäres Prädikat, das true zurückgibt, wenn die Elemente als gleich behandelt werden sollen. Die Signatur der Prädikatfunktion sollte der folgenden entsprechen:
Während die Signatur kein |
| policy | - | die zu verwendende Ausführungsstrategie |
| Typanforderungen | ||
-ForwardIt muss die Anforderungen von LegacyForwardIterator erfüllen.
| ||
-BinaryPred muss die Anforderungen von BinaryPredicate erfüllen.
| ||
Rückgabewert
Der erste Iterator iter im Quellbereich, für den der folgende Ausdruck true ergibt:
bool(*iter == *std::next(iter))bool(p(*iter, std::next(iter))Wenn kein solcher Iterator gefunden wird, wird last zurückgegeben.
Komplexität
Gegeben result als Rückgabewert von adjacent_find, M als std::distance(first, result) und N als std::distance(first, last):
operator==.p.operator==.p.Ausnahmen
- Wenn die für die Parallelisierung erforderlichen temporären Speicherressourcen nicht verfügbar sind, wird std::bad_alloc ausgelöst.
- Wenn eine nicht gefangene Ausnahme beim Zugriff auf Objekte über ein Algorithmusargument ausgelöst wird, wird das Verhalten durch die Ausführungsstrategie bestimmt (für Standardstrategien wird std::terminate aufgerufen).
Mögliche Implementierung
| adjacent_find (1) |
|---|
template<class ForwardIt>
ForwardIt adjacent_find(ForwardIt first, ForwardIt last)
{
if (first == last)
return last;
ForwardIt next = first;
++next;
for (; next != last; ++next, ++first)
if (*first == *next)
return first;
return last;
}
|
| adjacent_find (2) |
template<class ForwardIt, class BinaryPred>
ForwardIt adjacent_find(ForwardIt first, ForwardIt last, BinaryPred p)
{
if (first == last)
return last;
ForwardIt next = first;
++next;
for (; next != last; ++next, ++first)
if (p(*first, *next))
return first;
return last;
}
|
Beispiel
#include <algorithm>
#include <functional>
#include <iostream>
#include <vector>
int main()
{
std::vector<int> v1{0, 1, 2, 3, 40, 40, 41, 41, 5};
auto i1 = std::adjacent_find(v1.begin(), v1.end());
if (i1 == v1.end())
std::cout << "No matching adjacent elements\n";
else
std::cout << "The first adjacent pair of equal elements is at "
<< std::distance(v1.begin(), i1) << ", *i1 = "
<< *i1 << '\n';
auto i2 = std::adjacent_find(v1.begin(), v1.end(), std::greater<int>());
if (i2 == v1.end())
std::cout << "The entire vector is sorted in ascending order\n";
else
std::cout << "The last element in the non-decreasing subsequence is at "
<< std::distance(v1.begin(), i2) << ", *i2 = " << *i2 << '\n';
}
Ausgabe:
The first adjacent pair of equal elements is at 4, *i1 = 40
The last element in the non-decreasing subsequence is at 7, *i2 = 41
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 240 | C++98 | die Komplexitätsanforderung war unklar | klargestellt |
Siehe auch
(C++20) |
findet die ersten beiden benachbarten Elemente, die gleich sind (oder ein gegebenes Prädikat erfüllen) (Algorithmus-Funktionsobjekt) |
| entfernt aufeinanderfolgende doppelte Elemente in einem Bereich (Funktionstemplate & Algorithmus-Funktionsobjekt) | |
(C++20) |