Anche se la questione è stata risolta, credo che questo esempio potrebbe chiarire ulteriormente la differenza.
for_each
appartiene a operazioni STL non modificabili, il che significa che queste operazioni non modificano gli elementi della raccolta o la raccolta stessa. Pertanto, il valore restituito da for_each viene sempre ignorato e non viene assegnato a un elemento di raccolta. Tuttavia, è ancora possibile modificare gli elementi della raccolta, ad esempio quando un elemento viene passato alla funzione f mediante riferimento. Si dovrebbe evitare tale comportamento in quanto non è coerente con i principi STL.
Al contrario, transform
funzione appartiene operazioni modificare STL e 'applicato dato predicati (unary_op o binary_op) agli elementi della raccolta o collezioni e memorizzare i risultati in un'altra raccolta.
#include <vector>
#include <iostream>
#include <algorithm>
#include <functional>
using namespace std;
void printer(int i) {
cout << i << ", ";
}
int main() {
int mynumbers[] = { 1, 2, 3, 4 };
vector<int> v(mynumbers, mynumbers + 4);
for_each(v.begin(), v.end(), negate<int>());//no effect as returned value of UnaryFunction negate() is ignored.
for_each(v.begin(), v.end(), printer); //guarantees order
cout << endl;
transform(v.begin(), v.end(), v.begin(), negate<int>());//negates elements correctly
for_each(v.begin(), v.end(), printer);
return 0;
}
che stamperà:
1, 2, 3, 4,
-1, -2, -3, -4,
'transform' ha un campo di uscita,' for_each' non lo fa. – user657267
Un sacco di '' consiste in funzioni molto simili, hanno solo una * leggera * differenza. –
o11c
@ o11c questo è esattamente quello che sto cercando. Ci deve essere una buona ragione per la leggera differenza. – bendervader