找出std::vector中所有元素的和的好方法是什么?
假设我有一个向量std::vector<int> vector,其中有几个元素。现在我要求所有元素的和。同样的东西有什么不同的表达方式?
找出std::vector中所有元素的和的好方法是什么?
假设我有一个向量std::vector<int> vector,其中有几个元素。现在我要求所有元素的和。同样的东西有什么不同的表达方式?
当前回答
#include<iostream>
#include<vector>
#include<numeric>
using namespace std;
int main() {
vector<int> v = {2,7,6,10};
cout<<"Sum of all the elements are:"<<endl;
cout<<accumulate(v.begin(),v.end(),0);
}
其他回答
似乎没有人能解决向量中可以有NaN值的元素求和的情况,例如numerical_limits<double>::quite_NaN()
我通常会遍历元素并直接检查。
vector<double> x;
//...
size_t n = x.size();
double sum = 0;
for (size_t i = 0; i < n; i++){
sum += (x[i] == x[i] ? x[i] : 0);
}
它一点都不花哨,也就是说,没有迭代器或任何其他技巧,但我是这样做的。有时,如果在循环中有其他事情要做,我想让代码更具可读性,我就写
double val = x[i];
sum += (val == val ? val : 0);
//...
在循环中,如果需要重用val。
#include<boost/range/numeric.hpp>
int sum = boost::accumulate(vector, 0);
我是一个Perl用户,我们有一个游戏是找到各种不同的方法来增加一个变量…这里没有什么不同。在c++中,有多少种方法可以求出一个向量元素的和,答案可能是无穷大……
我的观点是:
使用BOOST_FOREACH,摆脱丑陋的迭代器语法:
sum = 0;
BOOST_FOREACH(int & x, myvector){
sum += x;
}
在索引上迭代(非常容易阅读)。
int i, sum = 0;
for (i=0; i<myvector.size(); i++){
sum += myvector[i];
}
另一个是破坏性的,像访问堆栈一样访问vector:
while (!myvector.empty()){
sum+=myvector.back();
myvector.pop_back();
}
最简单的方法是使用std:accumulate of a vector<int> a:
#include <numeric>
cout << accumulate(A.begin(), A.end(), 0);
Std::accumulate可能有溢出问题,所以最好的方法是对较大的数据类型变量进行基于范围的积累,以避免溢出问题。
long long sum = 0;
for (const auto &n : vector)
sum += n;
然后使用static_cast<>进一步向下转换为适当的数据类型。