Namespaces
Variants

std:: adjacent_find

From cppreference.net
Algorithm library
Constrained algorithms and algorithms on ranges (C++20)
Constrained algorithms, e.g. ranges::copy , ranges::sort , ...
Execution policies (C++17)
Non-modifying sequence operations
Batch operations
(C++17)
Search operations
Modifying sequence operations
Copy operations
(C++11)
(C++11)
Swap operations
Transformation operations
Generation operations
Removing operations
Order-changing operations
(until C++17) (C++11)
(C++20) (C++20)
Sampling operations
(C++17)

Sorting and related operations
Partitioning operations
Sorting operations
Binary search operations
(on partitioned ranges)
Set operations (on sorted ranges)
Merge operations (on sorted ranges)
Heap operations
Minimum/maximum operations
Lexicographical comparison operations
Permutation operations
C library
Numeric operations
Operations on uninitialized memory
Definiert in Header <algorithm>
template < class ForwardIt >
ForwardIt adjacent_find ( ForwardIt first, ForwardIt last ) ;
(1) (constexpr seit C++20)
template < class ExecutionPolicy, class ForwardIt >

ForwardIt adjacent_find ( ExecutionPolicy && policy,

ForwardIt first, ForwardIt last ) ;
(2) (seit C++17)
template < class ForwardIt, class BinaryPred >

ForwardIt adjacent_find ( ForwardIt first, ForwardIt last,

BinaryPred p ) ;
(3) (constexpr seit C++20)
template < class ExecutionPolicy, class ForwardIt, class BinaryPred >

ForwardIt adjacent_find ( ExecutionPolicy && policy,
ForwardIt first, ForwardIt last,

BinaryPred p ) ;
(4) (seit C++17)

Durchsucht den Bereich [ first , last ) nach zwei aufeinanderfolgenden gleichen Elementen.

1) Elemente werden mit operator == verglichen.
3) Elemente werden mit dem gegebenen binären Prädikat p verglichen.
2,4) Gleich wie (1,3) , aber ausgeführt gemäß policy .
Diese Überladungen nehmen nur dann an der Überladungsauflösung teil, wenn alle folgenden Bedingungen erfüllt sind:

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
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 des Typs (möglicherweise const) Type1 und Type2 unabhängig von der Wertkategorie akzeptieren können (daher ist Type1 & nicht erlaubt , ebenso wenig wie Type1 , es sei denn, für Type1 ist eine Verschiebung äquivalent zu einer Kopie (seit C++11) ).
Die Typen Type1 und Type2 müssen so beschaffen sein, dass ein Objekt vom Typ ForwardIt dereferenziert und dann implizit in beide konvertiert werden kann. ​

Typanforderungen
-
ForwardIt muss die Anforderungen von LegacyForwardIterator erfüllen.
-
BinaryPred muss die Anforderungen von BinaryPredicate erfüllen.

Rückgabewert

Ein Iterator zum ersten des ersten Paars identischer Elemente, also der erste Iterator it für den gilt * it == * ( it + 1 ) für (1,2) oder p ( * it, * ( it + 1 ) ) ! = false für (3,4) .

Wenn keine solchen Elemente gefunden werden, last wird zurückgegeben.

Komplexität

Gegeben sei result als Rückgabewert von adjacent_find , M als std:: distance ( first, result ) und N als std:: distance ( first, last ) :

1) Genau min(M+1,N-1) Vergleiche unter Verwendung von operator == .
2) O(N) Vergleiche mit operator == .
3) Genau min(M+1,N-1) Anwendungen des Prädikats p .
4) O(N) Anwendungen des Prädikats p .

Exceptions

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 ExecutionPolicy einer der Standard-Policies ist, wird std::terminate aufgerufen. Für jede andere ExecutionPolicy ist das Verhalten implementierungsdefiniert.
  • Wenn der Algorithmus keinen Speicher allozieren kann, wird std::bad_alloc geworfen.

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 (3)
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;
}
**Anmerkung:** Da der Text innerhalb der `
`-Tags C++-Code enthält und gemäß den Anweisungen nicht übersetzt werden soll, wurde nur die strukturelle Übersetzung der HTML-Elemente durchgeführt. Die Funktionsnamen und C++-spezifischen Begriffe (wie `template`, `class`, `ForwardIt` etc.) bleiben unverändert, wie gefordert.

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 << "Keine benachbarten übereinstimmenden Elemente\n";
    else
        std::cout << "Das erste benachbarte Paar gleicher Elemente befindet sich an Position "
                  << 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 << "Der gesamte Vektor ist in aufsteigender Reihenfolge sortiert\n";
    else
        std::cout << "Das letzte Element in der nicht-absteigenden Teilfolge befindet sich an Position "
                  << std::distance(v1.begin(), i2) << ", *i2 = " << *i2 << '\n';
}

Ausgabe:

Das erste benachbarte Paar gleicher Elemente befindet sich an Position 4, *i1 = 40
Das letzte Element in der nicht-absteigenden Teilfolge befindet sich an Position 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 Korrigiertes Verhalten
LWG 240 C++98 das Prädikat wurde std:: find
( first, last, value ) - first Mal angewendet
für (1,3) , wobei value nie definiert wurde
angewendet std:: min (
( result - first ) + 1 ,
( last - first ) - 1 ) Mal

Siehe auch

Entfernt aufeinanderfolgende doppelte Elemente in einem Bereich
(Funktions-Template)
Findet die ersten zwei benachbarten Elemente, die gleich sind (oder ein gegebenes Prädikat erfüllen)
(Algorithmus-Funktionsobjekt)