std::mismatch în C++

Găsește prima poziție unde două intervale diferă și returnează iteratorii din ambele.

Sintaxă
std::pair<InputIt1, InputIt2> mismatch(InputIt1 first1, InputIt1 last1, InputIt2 first2, InputIt2 last2);

Ce face std::mismatch

std::mismatch avansează simultan prin două intervale cât timp elementele sunt egale. Returnează o pereche de iteratori care arată primul loc unde diferă (sau unde se termină unul dintre intervale).

Este util pentru a afla prefixul comun a două texte sau unde a apărut prima diferență între rezultatul așteptat și cel primit.

Parametri

Parametru Descriere
first1, last1 Primul interval.
first2, last2 Al doilea interval (last2 din C++14).

Ce returnează

std::pair cu iteratorul din primul și din al doilea interval.

Exemple

Exemplul 1: Prefixul comun a două cuvinte

#include <algorithm>
#include <print>
#include <string>

int main() {
    std::string a = "programare";
    std::string b = "programator";

    auto [ia, ib] = std::mismatch(a.begin(), a.end(), b.begin(), b.end());
    std::println("Prefix comun: {}", std::string(a.begin(), ia));
    std::println("Diferă la poziția {}: '{}' față de '{}'", ia - a.begin(), *ia, *ib);
}

Rezultat

Prefix comun: programa
Diferă la poziția 8: 'r' față de 't'

Exemplul 2: Prima întrebare greșită

#include <algorithm>
#include <print>
#include <vector>

int main() {
    std::vector<char> corecte{'a', 'c', 'b', 'd', 'a'};
    std::vector<char> elev{'a', 'c', 'd', 'd', 'b'};

    auto [ic, ie] = std::ranges::mismatch(corecte, elev);
    if (ic != corecte.end()) {
        std::println("Prima greșeală la întrebarea {}: {} în loc de {}", ic - corecte.begin() + 1, *ie, *ic);
    }
}

Rezultat

Prima greșeală la întrebarea 3: d în loc de b

Greșeli frecvente

  • Dereferențiezi iteratorii returnați fără să verifici dacă unul dintre ei a ajuns la sfârșitul intervalului său (intervalele erau identice sau unul este prefixul celuilalt).

Comenzi înrudite

  • std::equal: Verifică dacă două intervale conțin aceleași elemente, în aceeași ordine.
  • std::search: Caută prima apariție a unei secvențe de elemente în interiorul altui interval.
  • std::lexicographical_compare: Compară două intervale ca în dicționar și spune dacă primul vine înaintea celui de-al doilea.