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.