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