STL - swap

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

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

5.4.4: swap, iter_swap e swap_ranges

Si tratta di algoritmi per scambiare elementi di container.

Lo swap scambia due elementi che possono essere nello stesso o in differenti container.

Lo iter_swap prende due iteratori che fanno riferimento allo stesso o a differenti container e scambia gli elementi associati.

Lo swap_ranges permette di scambiare due intervalli che possono essere nello in differenti o nello stesso container - in questo caso bisogna fare attenzione al fatto che gli intervalli non si sovrappongano.

Per vedere il risultato dello swap sul vettore uso questa funzioncina d'appoggio:

void dump(vector& v) {
vector::const_iterator it = v.begin();
while (it != v.end()) {
cout << *it++ << ' ';
}
cout << endl;
}


Questo il resto del codice d'esempio:

#include<algorithm>
#include<algo.h>
#include<vector>

using namespace std;

int main() {
vector<int> v(15);
iota(v.begin(), v.end(), 10);
dump(v);

cout << "Swap elements v[3] and v[5]:\n";
swap(v[3], v[5]); // swap
dump(v);

cout << "swap first and last elements via iterator:" << endl;
vector<int>::iterator first = v.begin();
vector<int>::iterator last = v.end();
--last;
iter_swap(first, last); // swap
dump(v);

int third = v.size() / 3;
cout << "swap head and tail " << "(" << third << " positions):" << endl;
vector<int>::iterator middle1 = v.begin();
advance(middle1, third); // end of first third
vector<int>::iterator middle2 = v.end();
advance(middle2, -third); // beginning of second third
swap_ranges(first, middle1, middle2); // swap

dump(v);
}

Inizializzo il vettore usando la solita iota. Faccio un primo swap, passando due elementi dell'array per reference. Poi un secondo swap, passando l'iteratore che punta al primo e all'ultimo (valido) elemento dell'array.

Infine faccio uno swap di intervallo, scambiando il primo terzo del vettore con l'ultimo.

Nessun commento:

Posta un commento