Funktion zum Berechnen des Mittelwerts eines Arrays double[] mit Hilfe von Accumulate

Funktion zum Berechnen des Mittelwerts eines Arrays double[] mit Hilfe von Accumulate


Es muss die häufigste Funktion sein, für die jeder irgendwo einen Codeausschnitt hat, aber ich habe tatsächlich nicht weniger als 1,5 Stunden damit verbracht, auf SO sowie auf anderen C++-Sites danach zu suchen, und habe keine Lösung gefunden.


Ich möchte den Mittelwert von double array[] berechnen Verwenden einer Funktion . Ich möchte das Array als Referenz an die Funktion übergeben . Es gibt Millionen von Beispielen, bei denen der Mittelwert in einer main()-Schleife berechnet wird, aber was ich suche, ist eine Funktion, die ich in eine externe Datei einfügen und später jederzeit verwenden kann.


Bisher ist hier meine neueste Version, die einen Kompilierungsfehler ausgibt:


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

Der Kompilierfehler ist:



Können Sie mir sagen, wie ich diese Funktion beheben kann? Was bedeutet dieser Kompilierfehler?


Wenn ich std::accumulate verwende (über den bereits definierten using namespace std ), dann erhalte ich die folgende Fehlermeldung:


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

Warum ist 'accumulate' kein Mitglied von 'std'?


p.s.:Ich weiß, dass ich 'sum +=array[i]' machen kann und nicht akkumulieren, aber ich würde gerne verstehen, was hier passiert und wie ich mein Beispiel zum Laufen bringen kann.


Antworten:


Versuchen Sie hinzuzufügen


#include <numeric>

Es bringt die 'std::accumulate'-Funktion, nach der Sie suchen.


Wenn Sie weiter gehen, werden Sie ein Problem haben, die Anzahl der Elemente in Ihrem Array herauszufinden. Tatsächlich kann ein Array nicht an eine Funktion übergeben werden, in der Hoffnung, dass die Funktion in der Lage ist, die Größe des Arrays zu kennen. Es zerfällt zu einem Zeiger. Daher Ihre count Berechnung wird falsch sein. Wenn Sie in der Lage sein möchten, ein Array mit tatsächlicher Größe zu übergeben, müssen Sie eine Template-Funktion verwenden.


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

Einige Code-Antworten


double mean_array( double array[] ) {
int count = sizeof( array ) / sizeof( array[0] );
double sum = accumulate( array, array + count, 0 );
return ( double ) sum / count;
}
'accumulate' : is not a member of 'std' 'accumulate': identifier not found 
#include <numeric>
template <int N>
double mean_array( double ( &
array )[N] ) {
return std::accumulate( array, array + N, 0.0) / (double)(N);
}
  /** 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;
}
#include <numeric>
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;
}