C++ 中的 accumulate(a.begin(), a.end(), 0) 或 accumulate(a.begin(), a.end(), 0ll) 之间有什么区别吗?

Are there any differences between accumulate(a.begin(), a.end(), 0) or accumulate(a.begin(), a.end(), 0ll) in C++?

当我写 long long sum = accumulate(a.begin(), a.end(), 0);long long sum = accumulate(a.begin(), a.end(), 0ll); 时都给我相同的结果那么为什么使用 0ll 而不是仅 0 (其中 a 是 std:: vector<int> a(n) )?

我的完整代码是here

std::accumulate是一个模板,当传入0(应该是和的初始值)时,第二个模板参数将被推导为int,然后在int上求和,return类型也是int。然后在long long sum = accumulate(a.begin(), a.end(), 0);中,将returned int转换为long long赋值给sum.

另一方面,accumulate(a.begin(), a.end(), 0ll);long long 和 return 执行求和 long long

如果总和不会导致 int 溢出,则两种情况下您将得到相同的结果。否则,应该优先考虑第二个。

在功能上完全没有区别,但使用 Oll 而不是 O 将在 long long 中执行求和,并且 return 会导致 long long,这将防止在超过正常 int 的大整数和的情况下整数溢出范围。