#include <vector>
#include <iostream>
#include <iterator>
#include <algorithm>
template <typename Container, typename T = typename std::decay<decltype(*std::begin(std::declval<Container>()))>::type>
T variance(Container && c)
{
auto b = std::begin(c), e = std::end(c);
auto size = std::distance(b, e);
auto sum = std::accumulate(b, e, T());
auto mean = sum / size;
T accum = T();
for (const auto d : c)
accum += (d - mean) * (d - mean);
return std::sqrt(accum / (size - 1));
}
int main() {
// Works with vectors
std::vector<double> v = { 1.0, 2.5, 3.7 };
std::cout << variance(v) << std::endl;
// Works with raw arrays
double a[] = { 1.0, 2.5, 3.7 };
std::cout << variance(a) << std::endl;
// Ok this is ugly... But I want to enforce T=double in the function template.
int b[] = { 1, 2, 4 };
std::cout << variance<int (&)[3],double>(b) << std::endl;
return 0;
}
I2luY2x1ZGUgPHZlY3Rvcj4KI2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8aXRlcmF0b3I+CiNpbmNsdWRlIDxhbGdvcml0aG0+Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgQ29udGFpbmVyLCB0eXBlbmFtZSBUID0gdHlwZW5hbWUgc3RkOjpkZWNheTxkZWNsdHlwZSgqc3RkOjpiZWdpbihzdGQ6OmRlY2x2YWw8Q29udGFpbmVyPigpKSk+Ojp0eXBlPgpUIHZhcmlhbmNlKENvbnRhaW5lciAmJiBjKQp7CiAgICBhdXRvIGIgPSBzdGQ6OmJlZ2luKGMpLCBlID0gc3RkOjplbmQoYyk7CiAgICBhdXRvIHNpemUgPSBzdGQ6OmRpc3RhbmNlKGIsIGUpOwogICAgYXV0byBzdW0gPSBzdGQ6OmFjY3VtdWxhdGUoYiwgZSwgVCgpKTsKICAgIGF1dG8gbWVhbiA9IHN1bSAvIHNpemU7CiAgICBUIGFjY3VtID0gVCgpOwogICAgZm9yIChjb25zdCBhdXRvIGQgOiBjKQogICAgICAgIGFjY3VtICs9IChkIC0gbWVhbikgKiAoZCAtIG1lYW4pOwogICAgcmV0dXJuIHN0ZDo6c3FydChhY2N1bSAvIChzaXplIC0gMSkpOwp9CgppbnQgbWFpbigpIHsKCS8vIFdvcmtzIHdpdGggdmVjdG9ycwoJc3RkOjp2ZWN0b3I8ZG91YmxlPiB2ID0geyAxLjAsIDIuNSwgMy43IH07CglzdGQ6OmNvdXQgPDwgdmFyaWFuY2UodikgPDwgc3RkOjplbmRsOwoJCgkvLyBXb3JrcyB3aXRoIHJhdyBhcnJheXMKCWRvdWJsZSBhW10gPSB7IDEuMCwgMi41LCAzLjcgfTsKCXN0ZDo6Y291dCA8PCB2YXJpYW5jZShhKSA8PCBzdGQ6OmVuZGw7CgkKCS8vIE9rIHRoaXMgaXMgdWdseS4uLiBCdXQgSSB3YW50IHRvIGVuZm9yY2UgVD1kb3VibGUgaW4gdGhlIGZ1bmN0aW9uIHRlbXBsYXRlLgoJaW50IGJbXSA9IHsgMSwgMiwgNCB9OwoJc3RkOjpjb3V0IDw8IHZhcmlhbmNlPGludCAoJilbM10sZG91YmxlPihiKSA8PCBzdGQ6OmVuZGw7CgkKCXJldHVybiAwOwp9