私は簡単に質問をしていますが、オンラインで何も見つけることができませんでした。
unsigned char配列の要素の平均を計算するには? または、それと同じように、unsigned char に対して操作を実行しますか?
私は簡単に質問をしていますが、オンラインで何も見つけることができませんでした。
unsigned char配列の要素の平均を計算するには? または、それと同じように、unsigned char に対して操作を実行しますか?
C++03 および C++0x:
#include <numeric>
int count = sizeof(arr)/sizeof(arr[0]);
int sum = std::accumulate<unsigned char*, int>(arr,arr + count,0);
double average = (double)sum/count;
オンラインデモ: http://www.ideone.com/2YXaT
C++0x のみ (ラムダを使用)
#include <algorithm>
int sum = 0;
std::for_each(arr,arr+count,[&](int n){ sum += n; });
double average = (double)sum/count;
オンラインデモ: http://www.ideone.com/IGfht
他のものとほぼ同じように、それらを合計してカウントで割ります。オーバーフローを避けるために、通常、計算中にそれらをより大きなものに変換する必要があります。(よくあることですが) 浮動小数点の結果が必要な場合は、すべての計算を浮動小数点でも行う必要があります。
算術演算は で問題なく動作しunsigned charますが、C の算術演算が常に に昇格するという事実に驚かれることがありますint。
C++ の標準テンプレート ライブラリでは、
#include <numeric>
template<class InputIterator, class T>
T accumulate(InputIterator first, InputIterator last, T init);
の合計を計算するにはunsigned char arr[]、 を使用できますaccumulate(arr, arr + sizeof(arr) / sizeof(arr[0]), 0)。(0 はintここです。別の型を使用する方が適切な場合があります。)
STL を使用しない場合、これは単純にループで計算されます。
平均は、合計を長さで割ったものです ( sizeof(arr) / sizeof(arr[0]))。