I am creating a simple game and I use std::priority_queue
for giving commands to squads (every squad has a priority_que
It's sneaky, but you should be able to override functionality of std::priority_queue
to do what you need. This seems to work in some of the tests I've done:
template
class fixed_priority_queue : public std::priority_queue
{
public:
fixed_priority_queue(unsigned int size) : fixed_size(size) {}
void push(const T& x)
{
// If we've reached capacity, find the FIRST smallest object and replace
// it if 'x' is larger
if(this->size() == fixed_size)
{
// 'c' is the container used by priority_queue and is a protected member.
auto beg = c.begin(); auto end = c.end();
auto min = std::min_element(beg, end);
if(x > *min)
{
*min = x;
// Re-make the heap, since we may have just invalidated it.
std::make_heap(beg, end);
}
}
// Otherwise just push the new item.
else
{
priority_queue::push(x);
}
}
private:
fixed_priority_queue() {} // Construct with size only.
const unsigned int fixed_size;
// Prevent heap allocation
void * operator new (size_t);
void * operator new[] (size_t);
void operator delete (void *);
void operator delete[] (void*);
};
What's happening here?
std::priority_queue
class priority_queue::push()
method, exchanging lowest item with new itemTo use:
const unsigned int LIMIT = 20;
fixed_priority_queue fooQueue(LIMIT);
// Testing.
for(int i=0; i<40; i++)
fooQueue.push(rand());
for(int i=0; i
What's bad here?
priority_queue
calls make_heap
on the underlying container (std::vector by default). I'm not sure how often it's usually called, but we call it often if the queue is full. I think it may be called within priority_queue::push()
aswell?Hope this is useful, if not at least interesting.