我将如何弹出并推送此优先级队列?

时间:2011-11-11 04:47:26

标签: c++ stl typedef priority-queue

我正在尝试使用优先级队列中的作业进行推送和弹出。我该怎么办?我很好奇如何实现这个?

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;

3 个答案:

答案 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()

请查看http://www.cplusplus.com/reference/stl/priority_queue

的定义和示例

答案 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();