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