如何在 C++ 中定义具有四个值的优先级队列?

How to define a priority queue with four values in c++?

当我们有两个值,例如学生的 ID 和分数,并且我们想将其放入队列中时,我们按以下方式定义优先级队列。

priority_queue<pair<int,int> > queue;

假设我们有四个值可以放入队列中。即,我希望所有三个值作为队列中的单个实体,我将根据这三个值定义我自己的比较器。我是 STL 的新手,我找不到合适的方法来做这件事。

您有 std::tuple 用于此类情况。你写一个比较器就像你写一对一样。

Joachim 关于结构的想法是个好主意。我可能会更进一步,使结构成为它自己的 class(我们称它为 DataNode)。然后,您可以对数据节点对象(每个对象都指向自己的数据)进行排队和出队,而不是将原始数据传递到队列中。

#include <iostream>
#include <string>
#include <queue> 
#include <vector>
#include <cstdio>
#include <cstdlib>
#include <functional>
using namespace std;

struct Student
{   
    Student(string name, int id, int marks): name(name), id(id), marks(marks){}
    string name;
    int id;
    int marks;
};
struct DereferenceCompareNode : public std::binary_function<Student, Student, bool>
{
     bool operator()(const Student& lhs, const Student& rhs) const
     {
                if (lhs.id == rhs.id)
                {
                    return lhs.marks >rhs.marks;
                }
                else
                {
                    return lhs.id > rhs.id;
                }
     }
};
int main()
{
    priority_queue<Student, vector<Student>, DereferenceCompareNode> a;
    a.push(Student("yang", 1000, 98));
    a.push(Student("yang", 1000, 75));
    a.push(Student("zhang", 999, 98));
    a.push(Student("zhang", 999, 100));
    while( !a.empty() ){
        Student top = a.top();
            printf("%s, %d, %d\n", top.name.c_str(), top.id, top.marks);
                a.pop();
     }
    cout<<"hello world"<<endl;
}

这是输出:

wangyang@wangyang ~ $ ./a.out 
zhang, 999, 98
zhang, 999, 100
yang, 1000, 75
yang, 1000, 98

我想你可以使用这段代码, queue的用法请参考http://www.cplusplus.com/reference/queue/priority_queue/