У меня возникла проблема с pop при использовании очереди приоритетов C ++ STL для моего проекта.

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, и высовывать их.

-3

Решение

Должно быть проще написать класс-оболочку и сделать 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;
};
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]