打印std :: vector的平均值

时间:2014-03-24 18:57:28

标签: c++ vector

正如标题所示,我正在努力学习如何打印出矢量的平均值。可以通过以下方式完成:

int avgVec(const vector<int> & x)
{
   int sum=0;
   for(int i=0; i<x.size(); ++i)
    {
    sum+=x[i];//sets sum to vector size

    }
   return sum/x.size(); //Now calculates the average
}

这个设置是否正确?

现在有问题的向量从用户那里获取输入,应该设置为:

vector<int> myVec;
int i;
do
{
cin >> i;
myVec.push_back(i);
}while(i>0);

这是否也已正确设置?

现在为了打印平均值,我会去制作打印功能,或者只是在做完之后:

avgVec(myVec); 

我打印出myVec,还是我以错误的方式解决了这个问题? 我已经执行了代码并且实际上确实计算了平均值,但它只输入了第一个数字,这使得平均值为1。 我觉得我就在那里,但有一部分不是点击。

5 个答案:

答案 0 :(得分:2)

此代码段错误

vector<int> myVec;
int i;
do
{
cin >> i;
myVec.push_back(i);
}while(i>0);

因为您将输入一个非正数,这是向量的最后一个数字将是非正数。

有效代码看起来像

vector<int> myVec;
int i;
while ( cin >> i && i > 0 ) myVec.push_back(i);

该函数也是错误的,因为没有什么能阻止向量为空。所以我会用以下方式写它

int avgVec( const vector<int> & v )
{
   int sum = 0;

   for ( int x : v ) sum += x;

   return v.empty() ? 0 : sum / v.size();
}

答案 1 :(得分:2)

您的代码的主要问题是您使用整数算术

E.g。整数运算7/3→2,余数为1。

相反,例如1.0*std::accumulate( v.begin(), v.end(), 0 )/v.length(),乘以1.0强制转换为double(C和C ++中的默认浮点类型),并返回double


乘以1.0的替代方法是使用明确的static_cast,这更通用,但也更详细。

对于这种情况,另一种替代方案,不那么通用但更优雅,是使用0.0而不是整数0作为std::accumulate的起始值,如KitsuneYMG所述在a comment。这是有效的,因为起始值确定了累积的值类型及其结果。


另外,请注意您当前的输入代码会推送堆栈上的最后一个非正输入值,因此如果用户输入0作为最后一个值,它将对计数有贡献但不会对总和产生影响,从而降低平均值有点......

答案 2 :(得分:1)

使用C ++标准库:

double avgVec(std::vector<int> const&v) // note: the average must not be an integer
{
   return v.empty()? 0.0 :
          std::accumulate(v.begin(), v.end(), 0.0)) / v.size();
}

答案 3 :(得分:0)

惯用语C ++是:

int avgVec(const std::vector<int> & x)
{
   int sum = 0;

   for(std::vector<int>::iterator it = x.begin(); it != x.end(); ++it)
      sum += *it;

   return sum / x.size();
}

答案 4 :(得分:0)

看起来你使用零来停止输入循环,但仍然将它包含在向量中。这可能是您的意图,但确实会影响结果。