我在使用 for 循环和 std::reduce 对向量元素求和时进行了比较,但循环导致溢出,我正在努力找出原因。
这是代码:
void red(std::vector<unsigned> &v){
std::cout << std::reduce(v.begin(), v.end(), 0) << std::endl;
}
void sum(std::vector<unsigned> &v){
unsigned long long s = 0;
for (auto i : v)
s += i;
std::cout << s << std::endl;
}
调用函数:
std::vector<unsigned> v(std::stoi(argv[1]));
std::iota(v.begin(), v.end(), 0);
sum(v);
red(v);
我期望在这两种情况下得到相同的结果,但对于某些大值,循环会产生奇怪的结果。
直到 10000 都给出相同的(正确的)值。 对于 100000,reduce 给出正确的值,但循环给出 704982704。
我什至尝试这样做:
void red(std::vector<unsigned> &v){
unsigned long long s = std::reduce(v.begin(), v.end(), 0);
std::cout << s << std::endl;
}
但什么都没有改变。
std::reduce(v.begin(), v.end(), 0ULL);
// ^^^
你已经搞反了:你的循环代码 (
sum()
) 给出了正确的答案,但是你对 std::reduce()
的使用被破坏了,所以 (red()
) 给出了错误的答案。
尝试一下
69999
:
2449895001 (sum())
-1845072295 (red())
发生这种情况是因为您将有符号整数
0
传递给了 std::reduce()
。您应该传递一个未签名的。