Как бы я выталкивал и нажимал с этой очередью приоритетов?

Я пытаюсь использовать push и pop с заданиями из очереди приоритетов. Как бы я это сделал? Мне интересно, как это реализовать?

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;

person Community    schedule 11.11.2011    source источник
comment
Вы определили operator < для Job или специализированных less<Job>?   -  person K-ballo    schedule 11.11.2011
comment
Я не перегрузил оператор ‹. Я думаю, что чем меньше, тем меньше это очередь приоритетов в порядке убывания.   -  person    schedule 11.11.2011
comment
@aaronaaron: Как у вас может быть убывающий порядок, если вы не скажете C ++, как их упорядочить? Вы ожидаете, что C++ будет производить сравнение двух произвольных объектов из цельного куска ткани?   -  person Nicol Bolas    schedule 11.11.2011
comment
Вы путаете priority_queue с простой очередью?   -  person Joe    schedule 11.11.2011
comment
хорошо, я понимаю приоритетную очередь... Я использую ее как структуру данных для своего задания, но я не понимаю, как ее использовать с классами.   -  person    schedule 11.11.2011


Ответы (3)


При отправке нового задания будет копироваться много данных. Запомни. Вы должны перегрузить оператор ‹ для задания или меньше специализировать шаблон.

Попробуй это:

    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();
person BruceAdi    schedule 11.11.2011
comment
я могу как-нибудь отправить вам свой исходный код, лол, я просто хочу, чтобы вы посмотрели, о чем я говорю .... это сбивает с толку, выложите часть моего кода онлайн - person ; 11.11.2011

класс приоритетной очереди предоставляет основные операции для доступа к элементам в очереди:

  • void std::priority_queue::push(const T &): Помещает данный объект в приоритетную очередь.
  • const T &std::priority_queue::top() const: возвращает "верхний" элемент.
  • void std::priority_queue::pop();: Удаляет "верхний" элемент.

Просто замените Job на T.

КСТАТИ:

Я не перегрузил оператор ‹. Я думаю, что чем меньше, тем меньше это очередь приоритетов в порядке убывания.

И как он узнает, что такое «убывающий порядок», не зная, как их сравнивать? Все, что делает std::less, это вызывает то, что вы определили operator<. Если вы не определили operator<, то std::less не сможет работать.

person Nicol Bolas    schedule 11.11.2011
comment
@aaronaaron: Как что должно выглядеть? - person Nicol Bolas; 11.11.2011

обратитесь к этой ссылке: 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

person Carsten Greiner    schedule 11.11.2011
comment
Я видел это, но у меня проблемы с классом :( - person ; 11.11.2011