向量中的累加函数(STL)给出负和

Posted

技术标签:

【中文标题】向量中的累加函数(STL)给出负和【英文标题】:Accumulate function in Vector (STL) giving negative sum 【发布时间】:2021-02-20 09:24:51 【问题描述】:

当我编写下面的代码时,我得到一个负数 (-294967296)。

#include<iostream>
#include<vector>
#include<numeric>
using namespace std;
int main() 
    vector<long long int> v=1000000000 , 1000000000 , 1000000000 , 1000000000;
    cout<<"Sum of all the elements are:"<<endl;
    cout<<accumulate(v.begin(),v.end(),0);

但是当我编写下面的代码时,我得到一个正数 (2000000000)

#include<iostream>
#include<vector>
#include<numeric>
using namespace std;
int main() 
    vector<long long int> v=1000000000 , 1000000000;
    cout<<"Sum of all the elements are:"<<endl;
    cout<<accumulate(v.begin(),v.end(),0);

可能是什么原因?

【问题讨论】:

溢出。文字0 具有int 类型,因此您对accumulate() 的使用通过将所有long long int 值添加到int 来将它们相加。 int(通常)可以表示较小范围的值 a long long,溢出一个会给出未定义的行为。将0 更改为0LL 以使accumulate() 给出long long int 类型的结果。 【参考方案1】:

std::accumulate:https://en.cppreference.com/w/cpp/algorithm/accumulate 使用最后一个参数的类型进行计算。

您应该使用accumulate(v.begin(),v.end(),0ll);ll 使0 变为long long,然后所有计算都在long long 中完成,因此它不会溢出int

示例:https://ideone.com/QQCYIW

【讨论】:

真正的代码有效,非常感谢,但我想问一下,“ll 将 0 变为 long long”究竟是什么意思? 0怎么能长这么长? 文字有一个类型,所以0int,但0lllong long int 我会推荐L,所以它看起来不像1

以上是关于向量中的累加函数(STL)给出负和的主要内容,如果未能解决你的问题,请参考以下文章

有没有实现条件累加的boost或stl函数?

累加器与装载传送指令

组合部分标签向量并累加成完整向量

组合部分标签向量并累加成完整向量

pytorch torch.cumsum(input, dim, out=None)函数(沿轴逐级累加)

.减少没有累加器