为什么 std::accumulate 生成 705032704 作为输出而不是向量中元素的总和?

Why does std::accumulate generate 705032704 as output instead of the sum of the elements in the vector?

输出是 705032704 而不是 5000000000。这是为什么?我以为 std::accumulate 会计算向量中元素的总和。

#include <vector>
#include <algorithm>
#include <cmath>
#include <iomanip>
#include <string>
#include <iterator>
#include <queue>
#include <stack>
#include <numeric>

typedef long long ll;

int main()
{

    std::vector<ll> nums = {1000000000, 1000000000,1000000000,1000000000,1000000000};
    std::cout << std::accumulate(nums.begin(), nums.end(), 0);
    std::cin.ignore();

}

你的总和不是 long long,而是 int,试试这个

#include <vector>
#include <algorithm>
#include <iostream>
#include <numeric>

int main()
{

    std::vector<ll> nums = {1000000000, 1000000000,1000000000,1000000000,1000000000};
    std::cout << std::accumulate(nums.begin(), nums.end(), 0ll);
    std::cin.ignore();

}

整数溢出。

std::accumulate 从第三个参数的类型推断求和变量的类型。因为你传入一个整数,所以std::accumulate的结果也是一个整数。

改为传递 long long 文字(来自 C++11):

std::accumulate(nums.begin(), nums.end(), 0LL);

标准算法std::accumulate声明如下

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

所以模板参数T被用作累加器的类型。

在本次通话中

std::accumulate(nums.begin(), nums.end(), 0)

参数 T 的推导类型为 int,因为整数文字 0 的类型为 int。结果,int.

类型的累加器中存储的总和发生溢出

您必须至少使用 long long 整数文字 0ll as

std::accumulate(nums.begin(), nums.end(), 0ll)

或者使用双浮动文字可能是合理的

std::accumulate(nums.begin(), nums.end(), 0.0 )

这是一个演示程序

#include <iostream>
#include <vector>
#include <iterator>
#include <numeric>

using ll = long long int;

int main()
{
    std::vector<ll> nums = {1000000000, 1000000000,1000000000,1000000000,1000000000};
    std::cout << std::accumulate( std::begin( nums ), std::end( nums ), 0ll ) << '\n';
    std::cout << std::accumulate( std::begin( nums ), std::end( nums ), 0.0 ) << '\n';
}

它的输出是

5000000000
5e+09