- #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