它必须是每个人在某个地方都有代码片段的最常见功能,但实际上我花了不少于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]'方式而不是使用累积,但我想了解这里发生了什么,我怎样才能使我的例子有效。
答案 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;
}
如果你将一个数组传递给一个函数,你会“失去”它的大小,所以你必须把它作为一个参数传递(它比这复杂一点......但是现在它应该足够了)