STL - copy e copy_backward

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.2: copy e copy_backward

Questo algoritmo copia elementi da un intervallo ad una destinazione. La destinazione può essere l'inizio o la termine (nel caso di copy_backward) della copia. É un algoritmo che va usato con cautela, infatti c'é il rischio di sovrapposizione tra input e output, cosa che può causare risultati indefiniti.

Nell'esempio inizializziamo un vettore usando iota, poi lo copiamo in un altro vettore.

Più interessante il secondo utilizzo di copy, che copia il vettore in un ostream_iterator diretto verso cout e con l'uso di un asterisco come separatore. In pratica la copia risulta essere un dump del vettore sulla console.

Segue infine una backward_copy con sovrapposizione (benigna) dell'intervallo di input con quello di output.

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

using namespace std;

int main() {
vector<int> v1(7), v2(7, 0);
iota(v1.begin(), v1.end(), 0);

vector<int>::const_iterator it = v2.begin();
while(it != v2.end()) {
cout << *it++;
}
cout << endl;

copy(v1.begin(), v1.end(), v2.begin());
it = v2.begin();
while(it != v2.end()) {
cout << *it++ << ' ';
}
cout << endl;

// copy v1 to cout, separator *
ostream_iterator<int> output(cout, "*");
copy(v1.begin(), v1.end(), output); // 0*1*2*3*4*5*6*
cout << endl;

// overlapping ranges:
vector<int>::iterator last = v1.begin();
advance(last, 4); // 4 steps forward
copy_backward(v1.begin(), last, v1.end());

copy(v1.begin(), v1.end(), output); // 0*1*2*0*1*2*3*
cout << endl;
}

Nessun commento:

Posta un commento