[gcc-4.4/4.5]std::for_each непонятное поведение
От: marat321  
Дата: 13.07.11 13:24
Оценка:
Есть такой код (суммируем позиции из 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
Re: [gcc-4.4/4.5]std::for_each непонятное поведение
От: marat321  
Дата: 13.07.11 13:28
Оценка:
void operator()(int x) { acc += cv[x]; }

Можно даже эту строчку заменить на
void operator()(int x) { acc += cv[x]; std::cout << acc << std::endl; }


Видно как в аккумуляторе накапливается сумма.
Но в итоге все равно получаем 0.
Re: [gcc-4.4/4.5]std::for_each непонятное поведение
От: _nn_ www.nemerleweb.com
Дата: 13.07.11 13:48
Оценка: 3 (2)
Здравствуйте, marat321, Вы писали:

M>По идее в выводе add.acc ожидается 5, но почему-то там лежит 0


for_each

add передается по значению , и изменяется копия, а не оригинал.

Функтор желательно писать без состояния.
А для вашего случая есть accumulate.

P.S.
На всякий случай посоветую почитать статьи: http://rsdn.ru/summary/562.xml
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[2]: [gcc-4.4/4.5]std::for_each непонятное поведение
От: marat321  
Дата: 13.07.11 14:04
Оценка:
Здравствуйте, _nn_, Вы писали:

__>add передается по значению , и изменяется копия, а не оригинал.


Спасибо.
Re[2]: [gcc-4.4/4.5]std::for_each непонятное поведение
От: uzhas Ниоткуда  
Дата: 13.07.11 17:37
Оценка:
Здравствуйте, marat321, Вы писали:
M>Видно как в аккумуляторе накапливается сумма.
M>Но в итоге все равно получаем 0.
а ларчик просто открывается http://ideone.com/gdDq6
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.