STL - transform

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.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