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 的大整数和的情况下整数溢出范围。
当我写 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 的大整数和的情况下整数溢出范围。