[Редактировать] Первоначально я неправильно понял первоначальные намерения автора.Я исправил ошибку.
for_each (coll.begin (), coll.end (), AddValue (* coll. Begin ()));
После добавления первого элемента вывод будет следующим:
22 23 24 25 26 27 28 29 30
что я не понимаю, так это во втором случае, почемувывод не
22 34 35 36 37 38 39 40 41
означает, что новый функтор создается для каждого вызова или функтор используется для каждого вызова?
Прежде всего, независимо от того, копирует ли алгоритм for_each функтор, который вы передаете, не имеет значения.Важно то, что вы должны хранить итератор или указатель на первый элемент, а не на указатель.Если вы делаете это и разыменовываете это каждый раз, это должно сработать.
struct AddValue
{
const int* ptr;
explicit AddValue(const int* iptr): ptr(iptr) {}
void operator() (int& elem) const {elem += *ptr; }
};
int main()
{
vector<int> v;
for (int j=1; j <= 9; ++j)
v.push_back(j + 10);
for_each(v.begin(), v.end(), AddValue(&v[0]) );
// v will be [22 34 35 36 37 38 39 40 41]
}
Однако мне придется добавить два моих цента о функциональном программировании.Вы можете получить действительно лаконичный, продуманный код с помощью функционального программирования.Тем не менее, это также большая проблема для отладки и имеет эффект децентрализации кода.Если ваш код не может извлечь из этого значительную пользу, рассмотрите возможность использования простых циклов для циклов, основанных на итераторах, когда это возможно, поскольку это даст вашим коллегам-программистам гораздо больше времени для отладки и чтения вашего кода.
Я сделал ошибку, получивВ прошлом я был очень властен с функциональным программированием, и это заставило мою команду ненавидеть меня.Я был одержим написанием дьявольски сложного кода с использованием комбинаторной логики предикатов и создал огромные библиотеки функциональных объектов, которые можно многократно использовать снова и снова и в комбинациях.На самом деле все, что я делал, это тратил много времени на написание функторов, когда я мог бы писать простые, одинаково многократно используемые функции, которые можно было бы вызывать (и вставлять так же легко) из простого цикла for, основанного на итераторе (даже проще писать с помощьюC ++ 0x на основе диапазона для цикла и BOOST_FOR_EACH).Я все еще использую функциональное программирование на C ++, но экономно.Когда вы сталкиваетесь с большими трудностями и собираете время, чтобы собрать две или три строки кода в одну, вы действительно должны спросить себя и глубоко задуматься, стоит ли это того, и не только для вас, но и для всех, кто работаетс вашим кодом.