STL - mismatch

Dal quinto capitolo di Designing Components with the C++ STL, di Ulrich Breymann. Algoritmi standard.

Sezione dedicata agli algoritmi che non modificano le sequenze su cui operano.

5.3.7: mismatch

confronta due container, con una variante che usa un predicato binario.

Come esempio creo un vettore di otto interi, inizializzati con i primi numeri pari. Copio gli elementi in un set di interi, usando il costruttore di set che accetta in input gli iteratori che delimitano i valori che voglio copiare.

Definisco un pair il cui primo elemento é un iteratore a un vettore di interi e il secondo un iteratore a un set di interi.

La funzione mismatch() ritornerà, per l'appunto, un pair di questo tipo, dato che gli passiamo gli iteratori di quel tipo.

Dato che le due sequenze sono identiche per costruzione, ci aspettiamo che il risultato della chiamata a mismatch() sia che non si sono trovate differenze, ovvero, il primo elemento del pair sarà uguale all'iteratore end() del vettore.

Modifichiamo un elemento del vettore e ripetiamo la chiamata a mismatch(). Ora ci aspettiamo di trovare una differenza, e questa sarà segnalata dal fatto che il primo elemento del pair sarà un iteratore diverso dall'end() del vettore, e in particolare punterà alla diffenza.

Ecco il codice:

#include<iostream>
#include<algorithm>
#include<vector>
#include<set>

using namespace std;

int main() {
vector<int> v(8);
for (size_t i = 0; i < v.size(); ++i)
v[i] = 2 * i; // sorted sequence
set<int> s(v.begin(), v.end()); // initialize set with v

pair<vector<int>::iterator, set<int>::iterator> where;

where = mismatch(v.begin(), v.end(), s.begin());
if (where.first == v.end())
cout << "No mismatch found." << endl;

++v[3]; // insert mismatch

// comparison for match with iterator pair ’where’
where = mismatch(v.begin(), v.end(), s.begin());
if (where.first != v.end()) {
cout << "First mismatch (" << *where.first << " != "
<< *where.second << ") found at position "
<< (where.first - v.begin()) << "." << endl;
}
}

Nessun commento:

Posta un commento