Sezione dedicata agli algoritmi che modificano le sequenze su cui operano.
5.4.5: transform
Se oltre a copiare elementi di un container vogliamo anche applicare dei cambiamenti, l'algoritmo da utilizzare é transform() che é disponibile in due variazioni, a seconda del fatto se vogliamo lavorare su uno o due elementi alla volta.
I parametri passati sono gli iteratori che delimitano la sequenza su cui lavorare e l'operazione, unaria o binaria, che vogliamo applicare sugli elementi stessi.
Nell'esempio che segue definiamo l'operazione unaria come funzione e la binaria come functor - poteva essere anche il contrario. Facciamo prima una modifica unaria "in place" e poi una binaria il cui output é mandato in un altro container.
#include<iostream>
#include<algorithm>
#include<string>
#include<vector>
using namespace std;
// unary operation as function
string toUppercase(string s) {
for (size_t i = 0; i < s.length(); ++i)
if (s[i] >= 'a' && s[i] <= 'z')
s[i] -= 'a'-'A';
return s;
}
// binary operation as functor
class Join {
public:
string operator()(const string& a, const std::string& b) {
return a + " and " + b;
}
};
int main() {
vector<string> gals(3), guys(3), couples(3);
gals[0] = "Annabella";
gals[1] = "Scheherazade";
gals[2] = "Xaviera";
guys[0] = "Bogey";
guys[1] = "Amadeus";
guys[2] = "Wladimir";
// transformation in place
transform(guys.begin(), guys.end(), guys.begin(), toUppercase);
// copy and transform
transform(gals.begin(), gals.end(), guys.begin(), couples.begin(), Join());
vector<string>::const_iterator it = couples.begin();
while(it != couples.end()) {
cout << *it++ << endl;
}
}
La prima chiamata a transform() modifica tutti gli elementi di guys usando la funzione toUppercase(), e mettendo il risultato ancora in guys, sempre a partire dal primo elemento - dunque la variazione viene fatta in place.
La seconda volta prendiamo in input tutti gli elementi di gals e guys, li modifichiamo usando il functor Join e mettiamo i risultati in couples.
Nessun commento:
Posta un commento