fork(1) download
  1. #include <array>
  2. #include <iostream>
  3. #include <queue>
  4.  
  5. template <typename T, size_t N = 2>
  6. class CyclicArray {
  7. public:
  8. typedef typename std::array<T, N>::value_type value_type;
  9. typedef typename std::array<T, N>::reference reference;
  10. typedef typename std::array<T, N>::const_reference const_reference;
  11. typedef typename std::array<T, N>::size_type size_type;
  12.  
  13. ~CyclicArray() {
  14. while (size())
  15. pop_front();
  16. }
  17.  
  18. void push_back(const T& v) {
  19. if (size_ + 1 > N)
  20. throw;
  21. new (&array_[(front_ + size_) % N]) T(v);
  22. ++size_;
  23. }
  24.  
  25. void pop_front() {
  26. if (size_ < 1)
  27. throw;
  28. front().~T();
  29. ++front_;
  30. --size_;
  31. if (front_ >= N)
  32. front_ = 0;
  33. }
  34.  
  35. const_reference front() const {
  36. return *static_cast<const T*>(&array_[front_]);
  37. }
  38.  
  39. reference front() {
  40. return *reinterpret_cast<T*>(&array_[front_]);
  41. }
  42.  
  43. size_type size() const {
  44. return size_;
  45. }
  46.  
  47. private:
  48. size_type front_ = 0;
  49. size_type size_ = 0;
  50. std::array<char[sizeof(T)], N> array_;
  51. };
  52.  
  53. int main() {
  54. std::queue<int, CyclicArray<int, 2>> queue;
  55. queue.push(1);
  56. queue.push(2);
  57. queue.pop();
  58. queue.push(3);
  59. int f = queue.front();
  60. queue.pop();
  61. std::cout << f << std::endl;
  62. f = queue.front();
  63. queue.pop();
  64. std::cout << f << std::endl;
  65. return 0;
  66. }
Success #stdin #stdout 0s 4552KB
stdin
Standard input is empty
stdout
2
3