我正在尝试使用优先级队列中的作业进行推送和弹出。我该怎么办?我很好奇如何实现这个?
class Job
{
public:
int job_id;
string job_description;
int n_procs;
int n_ticks;
Job(int job_id, string job_description, int n_procs, int n_ticks);
Job(void);
~Job(void);
};
typedef vector<Job> Jobs;
typedef priority_queue<Job, Jobs, less<Job>> JobQueue;
答案 0 :(得分:1)
priority queue class提供了访问队列中元素的基本操作:
void std::priority_queue::push(const T &)
:将给定对象推送到优先级队列。const T &std::priority_queue::top() const
:返回“top”元素。void std::priority_queue::pop();
:删除“top”元素。只需将Job
替换为T
。
顺便说一句:
我没有超载&lt;运营商。我认为不那么只是使它成为降序的优先级队列
如果不知道如何比较它们,它将如何知道“降序”是什么?所有std::less
都会调用您定义的operator<
。如果您尚未定义operator<
,那么std::less
将失败工作。
答案 1 :(得分:0)
参考此参考:http://www.cplusplus.com/reference/stl/priority_queue/pop/
您还可以找到此规范:
template < class T, class Container = vector<T>,
class Compare = less<typename Container::value_type> > class priority_queue;
这意味着(没有尝试自己)你应该能够做到:
JobQueue jq;
jq.push(Job(1,"one",0,1));
jq.push(Job(2,"two",2,3));
Job top = jq.pop()
的定义和示例
答案 2 :(得分:0)
推送新作业时会有大量数据副本。记在脑子里。你必须重载运算符&lt; for Job或专门设计模板。
试试这个:
class Job
{
public:
int job_id;
string job_description;
int n_procs;
int n_ticks;
Job(int job_id, string job_description, int n_procs, int n_ticks);
Job(void);
~Job(void);
};
bool operator < (Job const& rhs, Job const& lhs)
{
return rhs.n_ticks < lhs.n_ticks;
}
typedef vector<Job> Jobs;
typedef priority_queue<Job, Jobs, less<Job>> JobQueue;
Job job(1,"job 1", 1,2);
JobQueue jobs;
jobs.push(job);
Job const& topJop = jobs.top();
//do whatever with topTob
//remove it from the queue
job.pop();