std::accumulate() 결과가 예상과 다른 경우가 있다.

간단한 합을 구하는 코드를 살펴보자.

#include <iostream>
#include <numeric>
#include <vector>
using namespace std;

int main(int argc, char **argv) {
        long long sum1 = 0;
        long long sum2 = 0;

        vector<long> v;
        v.push_back(1234567890);
        v.push_back(2345678901);
        v.push_back(3456789012);

        for (int i=0;i<v.size();i++)
                sum1 += v[i];

        sum2 = accumulate(v.begin(), v.end(), 0);

        cout << "sum1: " << sum1 << endl;
        cout << "sum2: " << sum2 << endl;

        return 0;
}

for를 통한 합과 accumulate() 의 결과가 서로 다르게 나오는 것을 알 수 있다.

sum1: 7037035803
sum2: -1552898789

accumulate()의 반환값은 초기값 0의 타입(int)을 따라간다. 합계가 int 범위를 초과하면 상수값 뒤에 LL을 붙여 0LL(=long long)이나 0ULL(unsigned long long)을 사용해야 한다. (ll, ull 소문자도 가능)

sum2 = accumulate(v.begin(), v.end(), 0LL);

참고

cppreference

template< class InputIt, class T >
T accumulate( InputIt first, InputIt last, T init );