fork download
  1. #include <iostream>
  2. #include <vector>
  3.  
  4. template<class T, size_t MaxSize>
  5. class TopN
  6. {
  7. public:
  8. void push_back(T v)
  9. {
  10. if (m_vector.size() < MaxSize)
  11. m_vector.push_back(v);
  12. else
  13. m_vector[m_pos] = v;
  14.  
  15. if (++m_pos == MaxSize)
  16. m_pos = 0;
  17. }
  18.  
  19. class DummyIterator
  20. {
  21. public:
  22. TopN &r; // a direct reference to our boss.
  23. int p, m; // m: how many elements we can pull from vector, p: position of the cursor.
  24.  
  25. DummyIterator(TopN& t) : r(t), p(t.m_pos), m(t.m_vector.size()){}
  26.  
  27. operator bool() const { return (m > 0); }
  28.  
  29. T& operator *()
  30. {
  31. static T e = 0; // this could be removed
  32. if (m <= 0) // if someone tries to extract data from an empty vector
  33. return e; // instead of throwing an error, we return a dummy value
  34.  
  35. m--;
  36.  
  37. if (--p < 0)
  38. p = MaxSize - 1;
  39.  
  40. return r.m_vector[p];
  41. }
  42. };
  43.  
  44. decltype(auto) begin() { return m_vector.begin(); }
  45. decltype(auto) end() { return m_vector.end(); }
  46.  
  47. DummyIterator get_dummy_iterator()
  48. {
  49. return DummyIterator(*this);
  50. }
  51. private:
  52. std::vector<T> m_vector;
  53. int m_pos = 0;
  54. };
  55.  
  56. template<typename T, size_t S>
  57. void show(TopN<T,S>& t)
  58. {
  59. for (auto it = t.get_dummy_iterator(); it; )
  60. std::cout << *it << '\t';
  61.  
  62. std::cout << std::endl;
  63. };
  64.  
  65. int main(int argc, char* argv[])
  66. {
  67. TopN<int,10> top10;
  68. for (int i = 1; i <= 10; i++)
  69. top10.push_back(5 * i);
  70.  
  71. show(top10);
  72.  
  73. top10.push_back(60);
  74. show(top10);
  75.  
  76. top10.push_back(65);
  77. show(top10);
  78.  
  79. return 0;
  80. }
  81.  
Success #stdin #stdout 0s 3412KB
stdin
Standard input is empty
stdout
50	45	40	35	30	25	20	15	10	5	
60	50	45	40	35	30	25	20	15	10	
65	60	50	45	40	35	30	25	20	15