fork download
  1. #include <algorithm>
  2. #include <cmath>
  3. #include <iomanip>
  4. #include <iostream>
  5. #include <iterator>
  6. #include <numeric>
  7. #include <vector>
  8.  
  9. namespace detail {
  10. template <typename ForwardIterator>
  11. auto mean(ForwardIterator first, ForwardIterator last,
  12. const std::size_t elements_count) {
  13. const auto sum_of_elements = std::accumulate(first, last, 0.0);
  14. return sum_of_elements / elements_count;
  15. }
  16.  
  17. template <typename ForwardIterator>
  18. auto variance(ForwardIterator first, ForwardIterator last,
  19. const double elements_mean) {
  20. auto VarianceAccumulator = [elements_mean](auto total, auto next_value) {
  21. const auto diff = next_value - elements_mean;
  22. return total + (diff * diff);
  23. };
  24.  
  25. return std::accumulate(first, last, 0.0, VarianceAccumulator);
  26. }
  27. } //namespace
  28.  
  29. template <typename ForwardIterator>
  30. auto mean(ForwardIterator first, ForwardIterator last) {
  31. const auto element_count = std::distance(first, last);
  32. return detail::mean(first, last, element_count);
  33. }
  34.  
  35. template <typename ForwardIterator>
  36. auto standard_deviation(ForwardIterator first, ForwardIterator last) {
  37. const auto elements_count = std::distance(first, last);
  38. const auto elements_mean = detail::mean(first, last, elements_count);
  39. const auto elements_variance = detail::variance(first, last, elements_mean);
  40.  
  41. return std::sqrt(elements_variance / elements_count);
  42. }
  43.  
  44. template <typename ForwardIterator>
  45. void print_standard_deviation(ForwardIterator first, ForwardIterator last,
  46. std::ostream &out) {
  47. std::copy(first, last, std::ostream_iterator<int>(out, " "));
  48. out << "\nStandard Deviation: " << std::setprecision(4) << std::fixed
  49. << standard_deviation(first, last) << '\n' << '\n';
  50. }
  51.  
  52. int main() {
  53. std::vector<std::vector<int>> inputs{
  54. {5, 6, 11, 13, 19, 20, 25, 26, 28, 37},
  55. {37, 81, 86, 91, 97, 108, 109, 112, 112, 114, 115, 117, 121, 123, 141},
  56. {266, 344, 375, 399, 409, 433, 436, 440, 449, 476, 502, 504, 530, 584,
  57. 587},
  58. {809, 816, 833, 849, 851, 961, 976, 1009, 1069, 1125, 1161, 1172, 1178,
  59. 1187, 1208, 1215, 1229, 1241, 1260, 1373}};
  60.  
  61. for (const auto &input : inputs) {
  62. print_standard_deviation(input.begin(), input.end(), std::cout);
  63. }
  64. }
Success #stdin #stdout 0s 3276KB
stdin
Standard input is empty
stdout
5 6 11 13 19 20 25 26 28 37 
Standard Deviation: 9.7775

37 81 86 91 97 108 109 112 112 114 115 117 121 123 141 
Standard Deviation: 23.2908

266 344 375 399 409 433 436 440 449 476 502 504 530 584 587 
Standard Deviation: 83.6616

809 816 833 849 851 961 976 1009 1069 1125 1161 1172 1178 1187 1208 1215 1229 1241 1260 1373 
Standard Deviation: 170.1273