Есть такой код (суммируем позиции из c по индексам, лежащим в l):
#include <iostream>
#include <algorithm>
struct Adder {
int acc;
int *cv;
void operator()(int x) { acc += cv[x]; }
};
int main()
{
int c[] = {1, 1, 1, 1, 1};
int l[] = {0, 1, 2, 3, 4};
Adder add = {0, c};
std::for_each(l, l + 5, add);
std::cout << add.acc << std::endl;
}
По идее в выводе add.acc ожидается 5, но почему-то там лежит 0
void operator()(int x) { acc += cv[x]; }
Можно даже эту строчку заменить на
void operator()(int x) { acc += cv[x]; std::cout << acc << std::endl; }
Видно как в аккумуляторе накапливается сумма.
Но в итоге все равно получаем 0.
Здравствуйте, marat321, Вы писали:
M>По идее в выводе add.acc ожидается 5, но почему-то там лежит 0
for_each
add передается по значению , и изменяется копия, а не оригинал.
Функтор желательно писать без состояния.
А для вашего случая есть
accumulate.
P.S.
На всякий случай посоветую почитать статьи:
http://rsdn.ru/summary/562.xml
Здравствуйте, marat321, Вы писали:
M>Видно как в аккумуляторе накапливается сумма.
M>Но в итоге все равно получаем 0.
а ларчик просто открывается
http://ideone.com/gdDq6