bitrl & cuberl Documentation
Simulation engine for reinforcement learning agents
Loading...
Searching...
No Matches
fixed_size_priority_queue.h
Go to the documentation of this file.
1#ifndef FIXED_SIZE_PRIORITY_QUEUE_H
2#define FIXED_SIZE_PRIORITY_QUEUE_H
3
4#include "cubeai/base/cubeai_types.h"
5#include "cubeai/utils/cubeai_concepts.h"
6#include <vector>
7#include <functional>
8
9namespace cubeai {
10namespace containers {
11
12namespace detail
13{
14
15
19template<typename T, class Container = std::vector<T>>
21{
22public:
23
24 typedef T value_type;
25 typedef Container container_type;
26
27 typedef typename Container::iterator iterator;
28 typedef typename Container::const_iterator const_iterator;
29
33 explicit priority_queue_common(uint_t max_size) noexcept;
34
39 uint_t size()const noexcept{return pq_.size();}
40
45 uint_t capacity()const noexcept{return capacity_;}
46
51 bool empty()const noexcept{return pq_.empty();}
52
57 const value_type& top()const{return pq_.front();}
58
63 value_type top(){return pq_.front();}
64
65
66
67
68 iterator begin(){return pq_.begin();}
69 iterator end(){return pq_.end();}
70
71 const_iterator begin()const{return pq_.begin();}
72 const_iterator end()const{return pq_.end();}
73
74protected:
75
80 void push_back(const T& value){pq_.push_back(value);}
81
85 void pop_back(){pq_.pop_back();}
86
90 uint_t capacity_;
91
96
97};
98
99template<typename T, class Container>
101 :
102 capacity_(max_size),
103 pq_()
104{}
105
106}
107
111template<typename T, utils::concepts::is_default_constructible Compare = std::less<T>, class Container = std::vector<T>>
113{
114
115public:
116
117 typedef T value_type;
118 typedef Container container_type;
119 typedef Compare value_compare;
120 typedef typename Container::iterator iterator;
121 typedef typename Container::const_iterator const_iterator;
122
126 explicit FixedSizeMaxPriorityQueue(uint_t max_size) noexcept;
127
132 void push(const value_type& value);
133
137 void pop()noexcept;
138
144
145private:
146
150 value_compare value_cp_;
151};
152
153
154
155template<typename T, utils::concepts::is_default_constructible Compare, class Container>
156FixedSizeMaxPriorityQueue<T, Compare, Container>::FixedSizeMaxPriorityQueue(uint_t max_size) noexcept
157 :
158 detail::priority_queue_common<T, Container>(max_size),
159 value_cp_()
160{}
161
162
163template<typename T, utils::concepts::is_default_constructible Compare, class Container>
164void
166
167
168 if(this->size() >= this->capacity()){
169
170 // we need to differentiate if we
171 // implement a max_heap or a min_heap
172 auto min = std::min_element(this->begin(), this->end());
173
174 // only if this is better
175 if(*min < value){
176 *min = value;
177 }
178 }
179 else{
180
181 this->push_back(value);
182 }
183 std::make_heap(this->begin(), this->end(), value_cp_);
184}
185
186template<typename T, utils::concepts::is_default_constructible Compare, class Container>
187void
189
190 if(this->empty()){
191 return;
192 }
193
194 std::pop_heap(this->begin(), this->end(), value_cp_);
195 this->pop_back();
196}
197
198template<typename T, utils::concepts::is_default_constructible Compare, class Container>
201 auto item = this->top();
202 pop();
203 return item;
204}
205
206
210template<typename T, utils::concepts::is_default_constructible Compare = std::greater<T>, class Container = std::vector<T>>
212{
213
214public:
215
216 typedef T value_type;
217 typedef Container container_type;
218 typedef Compare value_compare;
219 typedef typename Container::iterator iterator;
220 typedef typename Container::const_iterator const_iterator;
221
225 explicit FixedSizeMinPriorityQueue(uint_t max_size) noexcept;
226
231 void push(const value_type& value);
232
236 void pop()noexcept;
237
242 value_type top_and_pop();
243
244private:
245
249 value_compare value_cp_;
250};
251
252
253
254template<typename T, utils::concepts::is_default_constructible Compare, class Container>
255FixedSizeMinPriorityQueue<T, Compare, Container>::FixedSizeMinPriorityQueue(uint_t max_size) noexcept
256 :
257 detail::priority_queue_common<T, Container>(max_size),
258 value_cp_()
259{}
260
261
262template<typename T, utils::concepts::is_default_constructible Compare, class Container>
263void
265
266
267 if(this->size() >= this->capacity()){
268
269 // get the max element
270 auto max = std::max_element(this->begin(), this->end());
271
272 // evoke the max element if the given
273 // value is smaller than it
274 if(*max > value){
275 *max = value;
276 }
277 }
278 else{
279
280 this->push_back(value);
281 }
282 std::make_heap(this->begin(), this->end(), value_cp_);
283}
284
285template<typename T, utils::concepts::is_default_constructible Compare, class Container>
286void
288
289 if(this->empty()){
290 return;
291 }
292
293 std::pop_heap(this->begin(), this->end(), value_cp_);
294 this->pop_back();
295}
296
297template<typename T, utils::concepts::is_default_constructible Compare, class Container>
300 auto item = this->top();
301 pop();
302 return item;
303}
304
305}
306
307}
308
309#endif // FIXED_SIZE_PRIORITY_QUEUE_H
FixedSizeMaxPriorityQueue.
Definition fixed_size_priority_queue.h:113
void push(const value_type &value)
push
Definition fixed_size_priority_queue.h:165
T value_type
Definition fixed_size_priority_queue.h:117
void pop() noexcept
pop
Definition fixed_size_priority_queue.h:188
Container::const_iterator const_iterator
Definition fixed_size_priority_queue.h:121
Container::iterator iterator
Definition fixed_size_priority_queue.h:120
Container container_type
Definition fixed_size_priority_queue.h:118
value_type top_and_pop()
top_and_pop
Definition fixed_size_priority_queue.h:200
Compare value_compare
Definition fixed_size_priority_queue.h:119
FixedSizeMaxPriorityQueue.
Definition fixed_size_priority_queue.h:212
Container container_type
Definition fixed_size_priority_queue.h:217
Container::iterator iterator
Definition fixed_size_priority_queue.h:219
T value_type
Definition fixed_size_priority_queue.h:216
Container::const_iterator const_iterator
Definition fixed_size_priority_queue.h:220
Compare value_compare
Definition fixed_size_priority_queue.h:218
Definition fixed_size_priority_queue.h:21
value_type top()
top
Definition fixed_size_priority_queue.h:63
Container::iterator iterator
Definition fixed_size_priority_queue.h:27
Container::const_iterator const_iterator
Definition fixed_size_priority_queue.h:28
priority_queue_common(uint_t max_size) noexcept
Constructor.
Definition fixed_size_priority_queue.h:100
Container container_type
Definition fixed_size_priority_queue.h:25
void push_back(const T &value)
push_back
Definition fixed_size_priority_queue.h:80
void pop_back()
pop_back
Definition fixed_size_priority_queue.h:85
bool empty() const noexcept
empty
Definition fixed_size_priority_queue.h:51
T value_type
Definition fixed_size_priority_queue.h:24
container_type pq_
pq_
Definition fixed_size_priority_queue.h:95
uint_t capacity_
capacity_
Definition fixed_size_priority_queue.h:90
uint_t capacity() const noexcept
capacity
Definition fixed_size_priority_queue.h:45
const_iterator end() const
Definition fixed_size_priority_queue.h:72
iterator begin()
Definition fixed_size_priority_queue.h:68
const_iterator begin() const
Definition fixed_size_priority_queue.h:71
iterator end()
Definition fixed_size_priority_queue.h:69
const value_type & top() const
top
Definition fixed_size_priority_queue.h:57
uint_t size() const noexcept
size
Definition fixed_size_priority_queue.h:39
Definition mc_tree_search_solver.h:22