for 循环中求和元素发生溢出,但 std::reduce 可以工作

问题描述 投票:0回答:2

我在使用 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;
}

但什么都没有改变。

c++ for-loop reduce
2个回答
0
投票
std::reduce(v.begin(), v.end(), 0ULL);
//                               ^^^

0
投票

你已经搞反了:你的循环代码 (

sum()
) 给出了正确的答案,但是你对
std::reduce()
的使用被破坏了,所以 (
red()
) 给出了错误的答案。

尝试一下

69999

2449895001 (sum())
-1845072295 (red())

发生这种情况是因为您将有符号整数

0
传递给了
std::reduce()
。您应该传递一个未签名的。

© www.soinside.com 2019 - 2024. All rights reserved.