typedef std::priority_queue< Task*, std::vector< Task* > > Priority_Q;
class TaskQueue : public Priority_Q
{
public:
TaskQueue();
// Queue op
void push(Task* t){
Priority_Q::push(t);
}
void pop(){
Priority_Q::pop();
}
}
Это правильный способ использования priority_queue
, Я буду толкать объекты, полученные из Task, и высовывать их.
Должно быть проще написать класс-оболочку и сделать STL priority_queue
переменная-член. Но чтобы убедиться, что вы настроили компаратор для вашей очереди, иначе структура данных STL не будет знать, как упорядочить ваши объекты. Есть несколько способов сделать это. Я просто использую один в качестве примера здесь.
Если вы хотите добавить синхронизацию в свою структуру данных, вы можете просто добавить внутренние блокировки и / или переменные условия в своем классе, чтобы заблокировать / разблокировать переменную-член q
,
class TaskQueue {
public:
TaskQueue() {};
bool empty() {
return q.empty()
}
void push(Task* t) {
q.push(t);
}
void pop() {
if (q.empty()) {
// You may want to do something here like throw an exception or not
}
// if not empty
q.pop();
}
Task* top() {
if (q.empty()) {
// You may want to do something here like throw an exception or not
}
return q.top();
}
private:
class TaskPtrComparator {
public:
bool operator()(Task* t1, Task* t2) {
// Comparison code here
}
};
priority_queue<Task*, vector<Task*>, TaskPtrComparator> q;
};
Других решений пока нет …