Несмотря на то, что на вопрос был дан ответ, я считаю, что этот пример прояснит разницу.
for_each
относится к немодулируемым операциям STL, что означает, что эти операции не меняют элементы коллекции или самой коллекции. Следовательно, значение , возвращаемое for_each, всегда игнорируется и не присваивается элементу коллекции. Тем не менее, все еще можно изменять элементы коллекции, например, когда элемент передается функции f с использованием ссылки. Следует избегать такого поведения, поскольку оно не согласуется с принципами STL.
В противоположности этому, transform
функции принадлежит операции модификации STL и применяет данный предикат (unary_op или binary_op) к элементам коллекции или коллекциям и результатам магазина в другой коллекции.
#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;
}
, который будет печатать:
1, 2, 3, 4,
-1, -2, -3, -4,
'transform' имеет выходной диапазон,' for_each' нет. – user657267
Множество '' состоит из функций, которые очень похожи, просто имеют * незначительную * разницу. –
o11c
@ o11c это именно то, что я ищу. Должна быть веская причина для небольшой разницы. – bendervader