如何在 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/
当我们有两个值,例如学生的 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/