fork(9) download
  1. #include <iostream>
  2. #include <queue>
  3. using std::vector;
  4. using std::cout;
  5. using std::endl;
  6. using std::fill;
  7. using std::min;
  8.  
  9. template<typename data_t, typename out_t>
  10. struct MovingAverage {
  11. size_t window, size, ptr;
  12. vector<data_t> data;
  13. out_t sum;
  14. explicit MovingAverage(size_t n) {
  15. init(n);
  16. }
  17. void init(size_t n) {
  18. data.resize(n);
  19. fill(data.begin(), data.end(), 0);
  20. window = n;
  21. size = 0;
  22. ptr = 0;
  23. sum = 0;
  24. }
  25. out_t feed(data_t val) {
  26. sum = sum + val - data[ptr];
  27. data[ptr] = val;
  28. size = min(size + 1, window);
  29. ptr = (ptr + 1) % window;
  30. return sum / size;
  31. }
  32. };
  33.  
  34. int main() {
  35. vector<int> array{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11};
  36. MovingAverage<int, double> avg(0);
  37. for (size_t size = 1; size <= array.size(); size++) {
  38. avg.init(size);
  39. cout << "size " << size << ": ";
  40. for (int elem: array) {
  41. cout << avg.feed(elem) << " ";
  42. }
  43. cout << endl;
  44. }
  45. return 0;
  46. }
Success #stdin #stdout 0s 15232KB
stdin
Standard input is empty
stdout
size 1: 1 2 3 4 5 6 7 8 9 10 11 
size 2: 1 1.5 2.5 3.5 4.5 5.5 6.5 7.5 8.5 9.5 10.5 
size 3: 1 1.5 2 3 4 5 6 7 8 9 10 
size 4: 1 1.5 2 2.5 3.5 4.5 5.5 6.5 7.5 8.5 9.5 
size 5: 1 1.5 2 2.5 3 4 5 6 7 8 9 
size 6: 1 1.5 2 2.5 3 3.5 4.5 5.5 6.5 7.5 8.5 
size 7: 1 1.5 2 2.5 3 3.5 4 5 6 7 8 
size 8: 1 1.5 2 2.5 3 3.5 4 4.5 5.5 6.5 7.5 
size 9: 1 1.5 2 2.5 3 3.5 4 4.5 5 6 7 
size 10: 1 1.5 2 2.5 3 3.5 4 4.5 5 5.5 6.5 
size 11: 1 1.5 2 2.5 3 3.5 4 4.5 5 5.5 6