分散 variance

結構前に作ったんですが、STL となるべく互換性を持たせて作った分散を求める関数。内容も短いしイテレータさえあれば使えるので便利かも?

#include <cmath>
#include <iterator>
#include <numeric>
/*! variance between iterators 'b' and 'e' with average 'a'. */
template <typename V, typename InItr> inline
V variance(InItr b, InItr e, V a) {
  const typename std::iterator_traits<InItr>::difference_type
    n = std::distance(b, e);  // size
  V v = 0;  // variance
  for (; b != e; ++b)  v += std::pow(a - *b, 2);
  return v / n;
}

/*! variance between iterators 'b' and 'e'. */
template <typename V, typename InItr> inline V variance(InItr b, InItr e) {
  const typename std::iterator_traits<InItr>::difference_type
    n = std::distance(b, e);
  return variance(b, e, std::accumulate(b, e, static_cast<V>(0)) / n);
}

int main() {
  const int array[10] = {1,2,3,4,5,6,7,8,9,0};
  double v = variance<double>(array, array + 10);
}