for_each странное поведение

Я мало использую STL и хочу начать его изучать, поэтому я сделал очень простую программу, используя функцию STL for_each. Вот вся программа (без заголовочных файлов):

class Object {
public:
    int s;

    Object() : s(0) { }

    Object(const Object& rhs) : s(rhs.s) { }

    void operator() (int a) {
        s += a;
    }
};

int main () {
    Object sum;
    int arr[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

    for_each(arr, arr + sizeof(arr) / sizeof(int), sum);

    cout << sum.s;

    cin.get();

    return 0;
}

Программа выводит 0. Я определенно использую for_each неправильно, но что именно не так с этим кодом?


person Seth Carnegie    schedule 30.04.2011    source источник
comment
На sgi.com/tech/stl/for_each.html есть такой пример один, но рабочий   -  person Dan D.    schedule 30.04.2011
comment
Дубликат Почему for_each не может изменить аргумент функтора?   -  person James McNellis    schedule 30.04.2011


Ответы (2)


for_each работает с копией предоставленного вами функтора, а затем возвращает копию в конце. Ты нуждаешься в этом:

sum = for_each(arr, arr + sizeof(arr) / sizeof(int), sum);
person Oliver Charlesworth    schedule 30.04.2011
comment
@Seth: Вот первое, о чем я подумал: потому что во многих случаях вы можете предоставить ему временный функтор, например for_each(..., Object()). Если бы потребовалась, скажем, ссылка, то это было бы невозможно, так как C++ запрещает привязывать ссылку не-const к временной. - person Oliver Charlesworth; 30.04.2011
comment
@Seth: ответ (философский ответ) на ваш вопрос Почему это происходит? можно найти здесь: Что не так с std::set? - person Nawaz; 30.04.2011

Если вы просто хотите рассчитать сумму, вы также можете использовать std::accumulate как:

#include <numeric>

int sum =std::accumulate(arr, arr + sizeof(arr) / sizeof(int),0);

Функтор не нужен!

person Nawaz    schedule 30.04.2011
comment
Суть была не в том, чтобы накопить сумму ints, а в том, чтобы использовать for_each. Но спасибо и +1, accumulate приятно знать об этом. - person Seth Carnegie; 30.04.2011
comment
@Seth: Я подумал, что было бы хорошо, если бы вы также знали альтернативы, но да, согласен, это не отвечает на ваш вопрос. @Oli уже объяснил это. Я не чувствовал повторения того же самого. Однако вы можете прочитать эту интересную тему, чтобы узнать философский ответ на свой вопрос: Что не так с std::set ? - person Nawaz; 30.04.2011