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);
참고
template< class InputIt, class T >
T accumulate( InputIt first, InputIt last, T init );