各コンテナ要素の『平均・分散・標準偏差』を計算するコード

たまに必要になるんだけど、毎回書き直しているのでメモっておく。
テストコードの結果はR言語と揃ってるのは確認済。

#include <iostream>
#include <cmath>
#include <vector>
#include <list>
#include <numeric>

template <template<class T, class Allocator = std::allocator<T> > class Container>
double mean(Container<double> & x)
{
	return std::accumulate(x.begin(), x.end(), 0.0) / x.size();
}
template <template<class T, class Allocator = std::allocator<T> > class Container>
double var(Container<double> & x)
{
	double size = x.size();
	double x_mean = mean(x);
	return (std::inner_product(x.begin(), x.end(), x.begin(), 0.0) - x_mean * x_mean * size)/ (size - 1.0);
}
template <template<class T, class Allocator = std::allocator<T> > class Container>
double sd(Container<double> & x)
{
	return std::sqrt(var(x));
}
int main()
{
	std::vector<double> x;
	x.push_back(1);
	x.push_back(2);
	x.push_back(3);
	x.push_back(4);
	std::list<double> y(x.begin(), x.end());

	std::cout << mean(x) << std::endl;
	std::cout << mean(y) << std::endl;
	std::cout << var(x)  << std::endl;
	std::cout << var(y)  << std::endl;
	std::cout << sd(x)   << std::endl;
	std::cout << sd(y)   << std::endl;
	return 0;
}

実行結果

2.5
2.5
1.66667
1.66667
1.29099
1.29099