创建一个求和函数以仅对向量的一部分求和

Posted

技术标签:

【中文标题】创建一个求和函数以仅对向量的一部分求和【英文标题】:creating a sum function for summing only part of a vector 【发布时间】:2011-09-18 17:59:55 【问题描述】:

显然我需要一个 sum 函数,并且累积不会削减它

我需要创建程序 - 一个向量 - 用户可以指定 n 个元素 - 并且 sum 函数只能对正元素求和,即使用户也可以输入负元素...

在computeSum函数中我还需要给整个组加一个“成功”

computeSum (dataVec, howMany, total, sucess);

并为输入的人创建一个参数 - 所有负数但想要对它们求和但由于没有正数而无法相加

if (success) 
   cout << "The sum is " << total << endl;

else 
cerr << "Oops, you cannot add these elements.";

这就是我得到的

#include <iostream>
#include <vector>        // need this in order to use vectors in the program
using namespace std;

int main()

    vector<double> dataVec;

    double i, n, howMany, total;
    cout << "How many numbers would you like to put into the vector?";
    cin >> n; 

    dataVec.resize(n);

    for(vector<double>::size_type i=0;i < n;i++)
    
        cout << "Enter the numbers: \n";
        cin >> dataVec[i];
    

    cout << "How many POSITIVE numbers would you like to sum?";
    cin >> howMany;
    cout << computeSum (dataVec, howMany, total);


 double computeSum (vector<double> &Vec, howMany, total)
 
      double total =0;
      for(int i=0;i < howMany;i++)
    total+=Vec[i];
      return total;
 

我似乎也无法编译这个 - computeSum() 在 int main(); 中没有被理解;在computerSum() 中没有理解howMany;并且在全局范围内,total() 和 howMany() 未声明(我想这意味着我需要在全局范围内进行 decalre ???)

【问题讨论】:

【参考方案1】:

事实上,accumulate 使用只考虑正值的适当函子“将其切断”:

int sum_positive(int first, int second) 
    return first + (second > 0 ? second : 0);


…

std::accumulate(data.begin(), data.begin() + how_many, 0, sum_positive);

【讨论】:

我认为,您要使用的重载需要 4 参数。【参考方案2】:

骑上我的爱好马:Boost Range Adaptors。和我一起达到甜蜜点

#include <boost/range/adaptors.hpp>
#include <boost/range/numeric.hpp>

bool isnatural(int i)  return i>=0; 
using namespace boost::adaptors;

int main(int argc, char** args)

    static const int data[] =  -130, -1543, 4018, 5542, -4389, 15266, ;

    std::cout << "sum: " << boost::accumulate(data | filtered(isnatural), 0) << std::endl;

    return 0;

输出:

总和:24826


用 C++11 awesomeness1spice

std::cout << "sum: " << boost::accumulate(data 
        | filtered([] (int i)  return i>=0; ), 0) << std::endl;

1:说实话,我真的很讨厌 lambda 语法的笨拙:

必须指定参数类型总是 必须将返回语句拼写为 对于这种情况,似乎 filtered([] (i) i&gt;=0 ) 可以由编译器计算出来。好吧,也许在 c++22 中:)

【讨论】:

【参考方案3】:

您的computeSum() 函数必须出现在源文件中的main() 函数上方,它才能在范围内。同样在您的 computeSum() 函数签名中,您没有为 howManytotal 变量指定类型。我猜他们应该是double howManydouble total

【讨论】:

"您的 computeSum() 函数必须出现在源文件中您的 main() 函数上方,它才能在范围内。" -- 不正确。正确的是computeSum() 的定义或声明需要出现在main() 之前。

以上是关于创建一个求和函数以仅对向量的一部分求和的主要内容,如果未能解决你的问题,请参考以下文章

窗口函数:仅对另一列中的不同值求和

为啥我的多线程并行求和函数的向量受限于线程数?

仅对每个 Id 的最新值求和

用于在 R 中创建和求和子集的用户定义函数

条件求和 (R)

如何定义自定义聚合函数来对一列向量求和?