STL - replace e variazioni

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.6: replace, replace_if, replace_copy, replace_copy_if

L'algoritmo base di replace() sostituisce ogni occorrenza del valore specificato nell'intervallo passato con un nuovo valore indicato.

La variante replace_if() permette di delegare a un predicato la decisione se effettuare o meno la sostituzione.

Con replace_copy e replace_copy_if l'algoritmo viene generalizzato permettendo di specificare dove vogliamo che vengano copiati i valori dell'intervallo passato.

Nell'esempio che segue vediamo all'opera replace() e le sue varianti:

#include<iostream>
#include<algorithm>
#include<string>
#include<vector>

using namespace std;

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

// unary predicate as functor

class Citrus {
public:

bool operator()(const std::string& a) {
return a == "lemon" || a == "orange" || a == "lime";
}
};

int main() {
vector<string> basket(3), crate(3);
basket[0] = "apple";
basket[1] = "orange";
basket[2] = "lemon";
dump(basket); // apple orange lemon

cout << "replace apple with quince:" << endl;
replace(basket.begin(), basket.end(), string("apple"), string("quince"));
dump(basket); // quince orange lemon

cout << "replace_if citrus fruits with plums:" << endl;
replace_if(basket.begin(), basket.end(), Citrus(), string("plum"));
dump(basket); // quince plum plum

cout << "replace_copy: plums with limes:" << endl;
replace_copy(basket.begin(), basket.end(), crate.begin(),
string("plum"), string("lime"));
dump(crate); // quince lime lime

cout << "replace_copy_if: citrus fruits with tomatoes:" << endl;
replace_copy_if(crate.begin(), crate.end(), basket.begin(), Citrus(),
string("tomato"));
dump(basket); // quince tomato tomato
}

Il functor Citrus fa da predicato; replace() sostituisce nel basket apple con quince; replace_if() usa il predicato per sostituire gli agrumi nel basket con plum; replace_copy() copia gli elementi dal basket al crate, sostituendo plum con lime; replace_copy_if() copia gli elementi del crate nel basket, sostituendo gli agrumi con tomato.

Nessun commento:

Posta un commento