创建求和函数,仅用于求和向量的一部分

时间:2011-09-18 17:59:56

标签: c++ stl vector

显然我需要一个求和函数,累积不会削减它

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

在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;
 }

我似乎也难以编译 - 在int main()中没有理解computeSum();如何在computerSum()中不理解任何事情;并且在一个gloabl范围total()和howMany()未声明(我猜这意味着我需要全局decalre ???)

3 个答案:

答案 0 :(得分:4)

事实上,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);

答案 1 :(得分:1)

登上我的爱好马:Boost Range Adapters。与我达成甜蜜点

#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 awesomeness 1 spice

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

<子>

  

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

     
      
  • 必须指定参数类型始终
  •   
  • 必须拼写退货声明   对于这种情况,似乎是filtered([] (i) { i>=0 })
      可以由编译器弄清楚。好吧,也许在c ++ 22 :)   
  •   

答案 2 :(得分:0)

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