【问题标题】:How would i pop and push with this priority queue?我将如何使用此优先级队列弹出和推送?
【发布时间】:2011-11-11 04:47:25
【问题描述】:

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

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;

【问题讨论】:

  • 您是为Jobs 定义了operator &lt;,还是专门为less&lt;Job&gt; 定义了less&lt;Job&gt;
  • 我没有重载
  • @aaronaaron:如果你不告诉 C++ 如何排序,你怎么会有“递减顺序”?您是否希望 C++ 可以用整块布制作两个任意对象的比较?
  • 您是否将 priority_queue 与普通队列混淆了?
  • 我理解优先级队列...我将它用作我的作业的数据结构,但我对如何将它与类一起使用感到困惑。

标签: c++ stl typedef priority-queue


【解决方案1】:

priority queue class 提供了访问队列中元素的基本操作:

  • void std::priority_queue::push(const T &amp;):将给定对象推送到优先级队列中。
  • const T &amp;std::priority_queue::top() const:返回“顶部”元素。
  • void std::priority_queue::pop();:移除“top”元素。

只需将Job 替换为T

顺便说一句:

我没有重载

在不知道如何比较它们的情况下,它如何知道“降序”是什么?所有std::less 所做的就是调用您定义的任何operator&lt;。如果您还没有定义operator&lt;,那么std::less失败工作。

【讨论】:

  • @aaronaaron:应该是什么样子?
【解决方案2】:

推送新作业时会复制大量数据。记住这一点。您必须为 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();

【讨论】:

  • 有什么办法可以把我的源代码发给你,哈哈,我只是想让你看看我在说什么……把我的部分代码放到网上会让人困惑
【解决方案3】:

参考这个参考: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的定义和例子

【讨论】:

  • 我看到了,但是我在上课时遇到了麻烦:(
猜你喜欢
  • 2012-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-12
  • 1970-01-01
  • 2014-01-19
  • 1970-01-01
  • 2011-12-20
相关资源
最近更新 更多