Re: priority_queue help
Bo Persson wrote:
Joe, G.I. wrote:
Ok, yes, I have higher level language backgrounds,
Java, right?
Also.
but my c++ books
also use 'new' so I'm a bit confused here. Is everywhere I'm using
'new' here not correct? I've added more detail here to clarify what
I can and tried to make the priority_queue changes.
C++ also has a new, but it is more unusual. There is no garbage
collection in the language, so you should also match each new with a
delete.
Match the new w/ a delete, or declare them as such ...
EventQueue localvarname ;
....and still use delete?
This all compiles, but crashes so I know I've got something wrong
w/ the new queue.
App::App()
{
pq = new EventQueue();
}
This looks very much like Java. In C++ you don't have to allocate
everything dynamically.
Ok, I guess I need to go read more about this then.
// Here I generate my Event classes w/ timestamps that will expire
soon. App::init()
{
for (int i = 0; i < 10; i++) {
Event *event = new Event();
event->set_tstamp();
pq->push_event(event);
}
}
// Now I need to find the event w/ the smallest timestamp.
// And this actually is in a while loop of sorts.
void EventListener::check_queue()
{
if (pq->count() > 0) {
Event *evnt = pq->top_event();
if (evnt->is_expired()) {
app.do_this(evnt->id());
pq->pop_event();
Here you will lose you object. The pointer is destroyed when popped,
but the pointed-to object is not.
Yeah, this is an easier point I understand.
}
}
}
// Here's what's now in my Event.h
class Event
{
private:
...
long _id;
public:
Event();
~Event();
double _exec_time;
long id();
bool set_id(long idx);
bool is_expired();
bool set_tstamp();
};
struct EventPointerCompare {
bool operator() ( Event* lhs, Event* rhs ) const {
return ( lhs->_exec_time < rhs->_exec_time );
}
};
I can't see that you are using this anywhere. The default for the
priority_queue is to sort elements stored - the pointers. the priority
will then be the address of the Events - random!
Yeah, using functors is really confusing for me. I'm not sure how this
is done yet.
// EventQueue.h
// my priority_queue has to be checked for expired events and
// there are cases where I want to know what type of event it is ...
// so that is why it's in a wrapper. not ok?
class EventQueue
{
private:
priority_queue<Event *> pq;
public:
EventQueue();
EventQueue(int queue_size);
~EventQueue();
int count();
bool push_event(Event *event);
bool pop_event();
Event* top_event();
bool execute_event();
bool check_queue();
bool contains_typeA_events();
};