使用累积计算数组double []的平均值的函数

时间:2011-10-26 06:15:24

标签: c++ arrays visual-studio-2010 stl std

它必须是每个人在某个地方都有代码片段的最常见功能,但实际上我花了不少于1.5小时在SO以及其他C ++网站上搜索它并且没有找到解决方案。

我想使用函数计算double array[]的平均值。我想将数组作为引用传递给函数。有数百万个例子在main()循环中计算均值,但我正在寻找的是一个函数,我可以把它放在外部文件中并在以后的任何时候使用它。

到目前为止,这是我的最新版本,它给出了编译错误:

double mean_array( double array[] )
{
    int count = sizeof( array ) / sizeof( array[0] );
    double sum = accumulate( array, array + count, 0 );
    return ( double ) sum / count;
}

编译错误是:

  

错误C3861:'accumulate':找不到标识符

你能告诉我如何修复这个功能吗?编译错误是什么意思?

如果我使用std::accumulate(在已定义的using namespace std上),则会收到以下错误:

'accumulate' : is not a member of 'std'
'accumulate': identifier not found

为什么'积累'不是'std'的成员?

ps:我知道我可以做'sum + = array [i]'方式而不是使用累积,但我想了解这里发生了什么,我怎样才能使我的例子有效。

4 个答案:

答案 0 :(得分:24)

尝试添加

#include <numeric>

它会引入你正在寻找的'std :: accumulate'功能。

更进一步,你要找出阵列中元素的数量有问题。实际上,数组不能传递给函数,希望函数能够知道数组的大小。它将衰减为指针。因此,您的count计算错误。如果您希望能够传递指定数组的实际大小,则必须使用模板化函数。

template <int N>
double mean_array( double ( & array )[N] )
{
    return std::accumulate( array, array + N, 0.0) / (double)(N);
}

答案 1 :(得分:3)

这不是你提出的问题,但你的代码示例中有一个容易出错的错误。 accumulate中的初始值是模板化的,在您的代码中它的模板是整数。如果你传递一组双打,这些将被转换为整数,你将得到错误的答案。在犯过这个错误之前,我自己做了如下快速保护:

  /** Check that not inputting integer type into accumulate
   *  This is considered an error in this program (where a double was expected
   *  @tparam InputIterator The iterator to accumulate
   *  @tparam T The type to accumulate - will fail if integer.
   *  @param first The first iterator to accumulate from.
   *  @param last the iterator to acculate to,
   *  @param init The initial value
   *  @return The accumulated value as evaluated by std::accumulate.
   */
  template<class InputIterator, class T>
  inline
  T
  accumulate_checked(InputIterator first, InputIterator last, T init )
  {
    return std::accumulate(first,last, init);
  }

  //Not implemented for integers (will not compile if called).
  template<class InputIterator>
  inline
  int
  accumulate_checked(InputIterator first, InputIterator last, int init );

如果感兴趣的话,我想分享一下。

为了完整起见,您的功能可能如下所示:

double mean_array( double *array, size_t count )
{
    double sum = std::accumulate(array,array+count,0.0)
    return sum / count;
}

或者要格外小心

double mean_array( double *array, size_t count )
{
    double sum = accumulate_checked(array,array+count,0.0)
    return sum / count;
}

或者更好的是来自Didier Trosset的模板化版本

答案 2 :(得分:2)

要使用std::accumulate,您需要包含相应的标头。将以下内容添加到源文件中。

#include <numeric>

答案 3 :(得分:0)

double mean_array( double *array, size_t count )
{
    double sum = 0.0;

    for (size_t i = 0; i < count; i++)
    {
        sum += array[i];
    }

    return sum / count;
}

double mean_array( double *array, size_t count )
{
    double sum = 0.0;
    double *pastLast = array + count;

    while (array < pastLast)
    {
        sum += *array;
        array++;
    }

    return sum / count;
}

如果你将一个数组传递给一个函数,你会“失去”它的大小,所以你必须把它作为一个参数传递(它比这复杂一点......但是现在它应该足够了)