Namensräume
Varianten
Aktionen

std::mismatch

Von cppreference.com
< cpp‎ | algorithm
 
 
Algorithmenbibliothek
Beschränkte Algorithmen und Algorithmen für Bereiche (C++20)
Beschränkte Algorithmen, z.B. ranges::copy, ranges::sort, ...
Ausführungsrichtlinien (C++17)
Nicht-modifizierende Sequenzoperationen
Stapeloperationen
(C++17)
Suchoperationen
(C++11)                (C++11)(C++11)
mismatch

Modifizierende Sequenzoperationen
Kopieroperationen
(C++11)
(C++11)
Tauschoperationen
Transformationsoperationen
Generierungsoperationen
Entfernungsoperationen
Ordnungsändernde Operationen
(bis C++17)(C++11)
(C++20)(C++20)
Stichprobenoperationen
(C++17)

Sortier- und verwandte Operationen
Partitionierungsoperationen
Sortieroperationen
Binäre Suchoperationen
(auf partitionierten Bereichen)
Mengenoperationen (auf sortierten Bereichen)
Zusammenführungsoperationen (auf sortierten Bereichen)
Heapoperationen
Minimum/Maximum-Operationen
(C++11)
(C++17)
Lexikographische Vergleichsoperationen
Permutationsoperationen
C-Bibliothek
Numerische Operationen
Operationen auf uninitialisiertem Speicher
 
Definiert in Header <algorithm>
template< class InputIt1, class InputIt2 >

std::pair<InputIt1, InputIt2>
    mismatch( InputIt1 first1, InputIt1 last1,

              InputIt2 first2 );
(1) (constexpr seit C++20)
template< class ExecutionPolicy, class ForwardIt1, class ForwardIt2 >

std::pair<ForwardIt1, ForwardIt2>
    mismatch( ExecutionPolicy&& policy,
              ForwardIt1 first1, ForwardIt1 last1,

              ForwardIt2 first2 );
(2) (seit C++17)
template< class InputIt1, class InputIt2, class BinaryPred >

std::pair<InputIt1, InputIt2>
    mismatch( InputIt1 first1, InputIt1 last1,

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

          class ForwardIt1, class ForwardIt2, class BinaryPred >
std::pair<ForwardIt1, ForwardIt2>
    mismatch( ExecutionPolicy&& policy,
              ForwardIt1 first1, ForwardIt1 last1,

              ForwardIt2 first2, BinaryPred p );
(4) (seit C++17)
template< class InputIt1, class InputIt2 >

std::pair<InputIt1, InputIt2>
    mismatch( InputIt1 first1, InputIt1 last1,

              InputIt2 first2, InputIt2 last2 );
(5) (seit C++14)
(constexpr seit C++20)
template< class ExecutionPolicy, class ForwardIt1, class ForwardIt2 >

std::pair<ForwardIt1, ForwardIt2>
    mismatch( ExecutionPolicy&& policy,
              ForwardIt1 first1, ForwardIt1 last1,

              ForwardIt2 first2, ForwardIt2 last2 );
(6) (seit C++17)
template< class InputIt1, class InputIt2, class BinaryPred >

std::pair<InputIt1, InputIt2>
    mismatch( InputIt1 first1, InputIt1 last1,

              InputIt2 first2, InputIt2 last2, BinaryPred p );
(7) (seit C++14)
(constexpr seit C++20)
template< class ExecutionPolicy,

          class ForwardIt1, class ForwardIt2, class BinaryPred >
std::pair<ForwardIt1, ForwardIt2>
    mismatch( ExecutionPolicy&& policy,
              ForwardIt1 first1, ForwardIt1 last1,

              ForwardIt2 first2, ForwardIt2 last2, BinaryPred p );
(8) (seit C++17)

Gibt ein Paar von Iteratoren auf das erste abweichende Element aus [first1last1) und einem Bereich beginnend bei first2 zurück.

  • Bei den Überladungen (1-4) hat der zweite Bereich std::distance(first1, last1) Elemente.
  • Bei den Überladungen (5-8) ist der zweite Bereich [first2last2).
  • Wenn std::distance(first1, last1) und std::distance(first2, last2) unterschiedlich sind, stoppt der Vergleich, wenn last1 oder last2 erreicht ist.
1,5) Elemente werden mit operator== verglichen.
3,7) Elemente werden mit dem gegebenen binären Prädikat p verglichen.
2,4,6,8) Wie (1,3,5,7), aber entsprechend policy ausgeführt.
Diese Überladungen nehmen an der Auflösungsauflösung teil, nur 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)

Inhalt

[bearbeiten] Parameter

first1, last1 - das Iteratorenpaar, das den ersten Bereich der zu vergleichenden Elemente definiert.
first2, last2 - das Iteratorenpaar, das den zweiten Bereich der zu vergleichenden Elemente definiert.
policy - die Ausführungsrichtlinie, die verwendet werden soll
p - binäre Prädikatfunktion, die ​true zurückgibt, wenn die Elemente als gleich behandelt werden sollen.

Die Signatur der Prädikatfunktion sollte äquivalent zur folgenden sein:

 bool pred(const Type1 &a, const Type2 &b);

Obwohl die Signatur nicht zwingend const & haben muss, darf die Funktion die ihr übergebenen Objekte nicht modifizieren und muss alle Werte vom Typ (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 gleichbedeutend mit einer Kopie(seit C++11)).
Die Typen Type1 und Type2 müssen so beschaffen sein, dass Objekte der Typen InputIt1 und InputIt2 dereferenziert und dann implizit in Type1 bzw. Type2 konvertiert werden können. ​

Typanforderungen
-
InputIt1 muss die Anforderungen von LegacyInputIterator erfüllen.
-
InputIt2 muss die Anforderungen von LegacyInputIterator erfüllen.
-
ForwardIt1 muss die Anforderungen von LegacyForwardIterator erfüllen.
-
ForwardIt2 muss die Anforderungen von LegacyForwardIterator erfüllen.
-
BinaryPred muss die Anforderungen an BinaryPredicate erfüllen.

[bearbeiten] Rückgabewert

std::pair mit Iteratoren auf die ersten beiden ungleichen Elemente.

Wenn last1 erreicht wird, ist der zweite Iterator im Paar der std::distance(first1, last1)-te Iterator nach first2.

Bei den Überladungen (5-8) ist der erste Iterator im Paar der std::distance(first2, last2)-te Iterator nach first1, wenn last2 erreicht wird.

[bearbeiten] Komplexität

Gegeben N1 als std::distance(first1, last1) und N2 als std::distance(first2, last2)

1,2) Höchstens N1 Vergleiche mit operator==.
3,4) Höchstens N1 Anwendungen des Prädikats p.
5,6) Höchstens min(N1,N2) Vergleiche mit operator==.
7,8) Höchstens min(N1,N2) Anwendungen des Prädikats p.

[bearbeiten] Ausnahmen

Die Überladungen mit einem Template-Parameter namens ExecutionPolicy berichten Fehler wie folgt

  • Wenn die Ausführung einer Funktion, die als Teil des Algorithmus aufgerufen wird, eine Ausnahme auslöst und ExecutionPolicy eine der Standardrichtlinien ist, wird std::terminate aufgerufen. Für jede andere ExecutionPolicy ist das Verhalten implementierungsabhängig.
  • Wenn dem Algorithmus der Speicher zur Neuzuweisung fehlt, wird std::bad_alloc ausgelöst.

[bearbeiten] Mögliche Implementierung

mismatch (1)
template<class InputIt1, class InputIt2>
std::pair<InputIt1, InputIt2>
    mismatch(InputIt1 first1, InputIt1 last1, InputIt2 first2)
{
    while (first1 != last1 && *first1 == *first2)
        ++first1, ++first2;
 
    return std::make_pair(first1, first2);
}
mismatch (3)
template<class InputIt1, class InputIt2, class BinaryPred>
std::pair<InputIt1, InputIt2>
    mismatch(InputIt1 first1, InputIt1 last1, InputIt2 first2, BinaryPred p)
{
    while (first1 != last1 && p(*first1, *first2))
        ++first1, ++first2;
 
    return std::make_pair(first1, first2);
}
mismatch (5)
template<class InputIt1, class InputIt2>
std::pair<InputIt1, InputIt2>
    mismatch(InputIt1 first1, InputIt1 last1, InputIt2 first2, InputIt2 last2)
{
    while (first1 != last1 && first2 != last2 && *first1 == *first2)
        ++first1, ++first2;
 
    return std::make_pair(first1, first2);
}
mismatch (7)
template<class InputIt1, class InputIt2, class BinaryPred>
std::pair<InputIt1, InputIt2>
    mismatch(InputIt1 first1, InputIt1 last1,
             InputIt2 first2, InputIt2 last2, BinaryPred p)
{
    while (first1 != last1 && first2 != last2 && p(*first1, *first2))
        ++first1, ++first2;
 
    return std::make_pair(first1, first2);
}

[bearbeiten] Beispiel

Dieses Programm bestimmt die längste Teilzeichenkette, die gleichzeitig am Anfang der gegebenen Zeichenkette und am Ende derselben, in umgekehrter Reihenfolge, vorkommt (möglicherweise überlappend).

#include <algorithm>
#include <iostream>
#include <string>
 
std::string mirror_ends(const std::string& in)
{
    return std::string(in.begin(),
                       std::mismatch(in.begin(), in.end(), in.rbegin()).first);
}
 
int main()
{
    std::cout << mirror_ends("abXYZba") << '\n'
              << mirror_ends("abca") << '\n'
              << mirror_ends("aba") << '\n';
}

Ausgabe

ab
a
aba

[bearbeiten] Siehe auch

Bestimmt, ob zwei Elementmengen gleich sind
(Funktionstempelat) [edit]
Findet das erste Element, das bestimmte Kriterien erfüllt
(Funktionstempelat) [edit]
gibt true zurück, wenn ein Bereich lexikographisch kleiner als ein anderer ist
(Funktionsvorlage) [editieren]
Sucht nach dem ersten Vorkommen eines Elementbereichs
(Funktionstempelat) [edit]
Findet die erste Position, an der sich zwei Bereiche unterscheiden
(Algorithmus-Funktionsobjekt)[edit]