fork download
  1. #include <algorithm>
  2. #include <iterator>
  3.  
  4. template<class queueT>
  5. struct fixed_size_queue_iterator {
  6. using value_type = typename queueT::value_type;
  7. using difference_type = std::ptrdiff_t;
  8. using pointer = value_type*;
  9. using reference = value_type&;
  10. using iterator_category = std::output_iterator_tag;
  11. using value_compare = typename queueT::value_compare;
  12.  
  13. fixed_size_queue_iterator(queueT& queue, std::size_t max_size)
  14. : queue_(&queue), max_size_(max_size), comp_() {}
  15. fixed_size_queue_iterator& operator=(const fixed_size_queue_iterator& it) {
  16. queue_ = it.queue_;
  17. max_size_ = it.max_size_;
  18. comp_ = it.comp_;
  19. }
  20. fixed_size_queue_iterator& operator=(const value_type& v) {
  21. if (queue_->size()<max_size_ || comp_(queue_->top(), v)) {
  22. queue_->pop();
  23. queue_->push(v);
  24. }
  25. return *this;
  26. }
  27. fixed_size_queue_iterator& operator=(value_type&& v) {
  28. if (queue_->size()<max_size_ || comp_(queue_->top(), v)) {
  29. queue_->pop();
  30. queue_->push(std::move(v));
  31. }
  32. return *this;
  33. }
  34. fixed_size_queue_iterator& operator*() {return *this;}
  35. fixed_size_queue_iterator& operator++() {return *this;}
  36. fixed_size_queue_iterator& operator++(int) {return *this;}
  37. private:
  38. queueT* queue_;
  39. std::size_t max_size_;
  40. value_compare comp_;
  41. };
  42. template<class queueT>
  43. fixed_size_queue_iterator<queueT> fixed_size_queue_inserter(queueT& queue, std::size_t max_size) {
  44. return {queue,max_size};
  45. }
  46.  
  47. template<class queueT>
  48. struct pop_queue_iterator {
  49. using value_type = typename queueT::value_type;
  50. using difference_type = std::ptrdiff_t;
  51. using pointer = value_type*;
  52. using const_pointer = const value_type*;
  53. using reference = value_type&;
  54. using const_reference = const value_type&;
  55. using iterator_category = std::output_iterator_tag;
  56.  
  57. pop_queue_iterator() : queue_(nullptr) {}
  58. pop_queue_iterator(queueT& queue) : queue_(&queue) {}
  59. const_reference operator*() {return queue_->top();}
  60. const_pointer operator->() {return &queue_->top();}
  61. pop_queue_iterator& operator++() {queue_->pop(); return *this;}
  62. pop_queue_iterator& operator++(int) {queue_->pop(); return *this;}
  63. bool operator==(const pop_queue_iterator& it) const {return empty()==it.empty();}
  64. bool operator!=(const pop_queue_iterator& it) const {return empty()!=it.empty();}
  65. private:
  66. queueT* queue_;
  67. bool empty() const {return queue_==nullptr||queue_->empty();}
  68. };
  69. template<class queueT>
  70. pop_queue_iterator<queueT> pop_queue_begin_iterator(queueT& queue) {
  71. return {queue};
  72. }
  73. template<class queueT>
  74. pop_queue_iterator<queueT> pop_queue_end_iterator(queueT&) {
  75. return {};
  76. }
  77.  
  78. #include <iostream>
  79. #include <queue>
  80.  
  81. int main() {
  82. int random[] = {5, 7, 3, 1, 9, 8, 4, 0, 2, 6};
  83. std::priority_queue<int,std::vector<int>,std::greater<int>> queue;
  84. std::copy(std::begin(random), std::end(random), fixed_size_queue_inserter(queue, 4));
  85. std::copy(pop_queue_begin_iterator(queue), pop_queue_end_iterator(queue), std::ostream_iterator<int>(std::cout," "));
  86. }
  87.  
Compilation error #stdin compilation error #stdout 0s 0KB
stdin
Standard input is empty
compilation info
prog.cpp: In instantiation of ‘struct fixed_size_queue_iterator<std::priority_queue<int, std::vector<int>, std::greater<int> > >’:
prog.cpp:84:87:   required from here
prog.cpp:11:57: error: no type named ‘value_compare’ in ‘class std::priority_queue<int, std::vector<int>, std::greater<int> >’
     using value_compare = typename queueT::value_compare;
                                                         ^
prog.cpp: In instantiation of ‘fixed_size_queue_iterator<queueT>::fixed_size_queue_iterator(queueT&, std::size_t) [with queueT = std::priority_queue<int, std::vector<int>, std::greater<int> >; std::size_t = long unsigned int]’:
prog.cpp:44:27:   required from ‘fixed_size_queue_iterator<queueT> fixed_size_queue_inserter(queueT&, std::size_t) [with queueT = std::priority_queue<int, std::vector<int>, std::greater<int> >; std::size_t = long unsigned int]’
prog.cpp:84:87:   required from here
prog.cpp:14:50: error: using invalid field ‘fixed_size_queue_iterator<queueT>::comp_’
     : queue_(&queue), max_size_(max_size), comp_() {}
                                                  ^
prog.cpp: In instantiation of ‘fixed_size_queue_iterator<queueT>& fixed_size_queue_iterator<queueT>::operator=(const value_type&) [with queueT = std::priority_queue<int, std::vector<int>, std::greater<int> >; fixed_size_queue_iterator<queueT>::value_type = int]’:
/usr/include/c++/6/bits/stl_algobase.h:324:18:   required from ‘static _OI std::__copy_move<false, false, std::random_access_iterator_tag>::__copy_m(_II, _II, _OI) [with _II = int*; _OI = fixed_size_queue_iterator<std::priority_queue<int, std::vector<int>, std::greater<int> > >]’
/usr/include/c++/6/bits/stl_algobase.h:386:44:   required from ‘_OI std::__copy_move_a(_II, _II, _OI) [with bool _IsMove = false; _II = int*; _OI = fixed_size_queue_iterator<std::priority_queue<int, std::vector<int>, std::greater<int> > >]’
/usr/include/c++/6/bits/stl_algobase.h:422:45:   required from ‘_OI std::__copy_move_a2(_II, _II, _OI) [with bool _IsMove = false; _II = int*; _OI = fixed_size_queue_iterator<std::priority_queue<int, std::vector<int>, std::greater<int> > >]’
/usr/include/c++/6/bits/stl_algobase.h:455:8:   required from ‘_OI std::copy(_II, _II, _OI) [with _II = int*; _OI = fixed_size_queue_iterator<std::priority_queue<int, std::vector<int>, std::greater<int> > >]’
prog.cpp:84:88:   required from here
prog.cpp:21:41: error: using invalid field ‘fixed_size_queue_iterator<queueT>::comp_’
         if (queue_->size()<max_size_ || comp_(queue_->top(), v)) {
                                         ^~~~~
stdout
Standard output is empty