class Person
{
public:
int age;
};
我想将Person类的对象存储在优先级队列中。
priority_queue< Person, vector<Person>, ??? >
我认为我需要为比较对象定义一个类,但是我不确定。
而且,当我们写的时候
priority_queue< int, vector<int>, greater<int> >
大工作如何进行?
Answers:
Person
在这种情况下,您需要为队列中存储的类型提供有效的严格弱排序比较。默认值为use std::less<T>
,它解析为等效于operator<
。这依赖于它自己的存储类型(具有一个)。因此,如果您要实施
bool operator<(const Person& lhs, const Person& rhs);
它应该可以正常工作,而无需任何进一步的更改。实现可能是
bool operator<(const Person& lhs, const Person& rhs)
{
return lhs.age < rhs.age;
}
如果类型没有自然的“小于”比较,则提供您自己的谓词(而不是default)会更有意义std::less<Person>
。例如,
struct LessThanByAge
{
bool operator()(const Person& lhs, const Person& rhs) const
{
return lhs.age < rhs.age;
}
};
然后像这样实例化队列:
std::priority_queue<Person, std::vector<Person>, LessThanByAge> pq;
关于std::greater<Person>
作为比较器的使用,这将使用的等效器,operator>
并具有在默认情况下使用优先级倒置的WRT创建队列的效果。这将需要存在一个operator>
可以在两个Person
实例上运行的对象。
operator<
这里的用法。operator<
实现类型的默认比较,以我的经验,这很少是您想要的。我认为Mike在回答中描述的方法几乎总是可取的。
bool YourClass::operator <(const YourClass&) const
还将允许透明使用默认比较器std::less<T>
。并不是您所需要的那么灵活,而是可以正常工作。(和+1)。
std::tie
,在这种情况下,它是微不足道的。
您将编写一个比较器类,例如:
struct CompareAge {
bool operator()(Person const & p1, Person const & p2) {
// return "true" if "p1" is ordered before "p2", for example:
return p1.age < p2.age;
}
};
并将其用作比较器参数:
priority_queue<Person, vector<Person>, CompareAge>
使用greater
会给默认值赋予相反的顺序less
,这意味着队列将为您提供最小值而不是最大值。
优先级队列是一种抽象的数据类型,它捕获容器的概念,其元素具有附加的“优先级”。最高优先级的元素始终出现在队列的最前面。如果该元素被删除,则下一个优先级最高的元素将排在最前面。
C ++标准库使用以下操作定义了类模板priority_queue:
push:将元素插入优先级队列。
top:从优先级队列返回(不删除它)最高优先级的元素。
pop:从优先级队列中删除优先级最高的元素。
size:返回优先级队列中的元素数。
空:根据优先级队列是否为空,返回true或false。
以下代码段显示了如何构造两个优先级队列,一个可以包含整数,另一个可以包含字符串:
#include <queue>
priority_queue<int> q1;
priority_queue<string> q2;
以下是优先级队列用法的示例:
#include <string>
#include <queue>
#include <iostream>
using namespace std; // This is to make available the names of things defined in the standard library.
int main()
{
piority_queue<string> pq; // Creates a priority queue pq to store strings, and initializes the queue to be empty.
pq.push("the quick");
pq.push("fox");
pq.push("jumped over");
pq.push("the lazy dog");
// The strings are ordered inside the priority queue in lexicographic (dictionary) order:
// "fox", "jumped over", "the lazy dog", "the quick"
// The lowest priority string is "fox", and the highest priority string is "the quick"
while (!pq.empty()) {
cout << pq.top() << endl; // Print highest priority string
pq.pop(); // Remmove highest priority string
}
return 0;
}
该程序的输出为:
the quick
the lazy dog
jumped over
fox
由于队列遵循优先顺序,因此字符串从最高优先级到最低优先级打印。
有时,需要创建一个优先级队列来包含用户定义的对象。在这种情况下,优先级队列需要知道用于确定哪些对象具有最高优先级的比较标准。这是通过属于某个类的函数对象完成的,该函数对象使operator()重载。为了确定优先级,重载的()充当<。例如,假设我们要创建一个优先级队列来存储Time对象。时间对象具有三个字段:小时,分钟,秒:
struct Time {
int h;
int m;
int s;
};
class CompareTime {
public:
bool operator()(Time& t1, Time& t2) // Returns true if t1 is earlier than t2
{
if (t1.h < t2.h) return true;
if (t1.h == t2.h && t1.m < t2.m) return true;
if (t1.h == t2.h && t1.m == t2.m && t1.s < t2.s) return true;
return false;
}
}
按照上述比较标准存储时间的优先级队列将定义如下:
priority_queue<Time, vector<Time>, CompareTime> pq;
Here is a complete program:
#include <iostream>
#include <queue>
#include <iomanip>
using namespace std;
struct Time {
int h; // >= 0
int m; // 0-59
int s; // 0-59
};
class CompareTime {
public:
bool operator()(Time& t1, Time& t2)
{
if (t1.h < t2.h) return true;
if (t1.h == t2.h && t1.m < t2.m) return true;
if (t1.h == t2.h && t1.m == t2.m && t1.s < t2.s) return true;
return false;
}
};
int main()
{
priority_queue<Time, vector<Time>, CompareTime> pq;
// Array of 4 time objects:
Time t[4] = { {3, 2, 40}, {3, 2, 26}, {5, 16, 13}, {5, 14, 20}};
for (int i = 0; i < 4; ++i)
pq.push(t[i]);
while (! pq.empty()) {
Time t2 = pq.top();
cout << setw(3) << t2.h << " " << setw(3) << t2.m << " " <<
setw(3) << t2.s << endl;
pq.pop();
}
return 0;
}
该程序可打印从最新到最早的时间:
5 16 13
5 14 20
3 2 40
3 2 26
如果我们希望最早的时间具有最高的优先级,则可以这样重新定义CompareTime:
class CompareTime {
public:
bool operator()(Time& t1, Time& t2) // t2 has highest prio than t1 if t2 is earlier than t1
{
if (t2.h < t1.h) return true;
if (t2.h == t1.h && t2.m < t1.m) return true;
if (t2.h == t1.h && t2.m == t1.m && t2.s < t1.s) return true;
return false;
}
};
这段代码可能会有所帮助。
#include <bits/stdc++.h>
using namespace std;
class node{
public:
int age;
string name;
node(int a, string b){
age = a;
name = b;
}
};
bool operator<(const node& a, const node& b) {
node temp1=a,temp2=b;
if(a.age != b.age)
return a.age > b.age;
else{
return temp1.name.append(temp2.name) > temp2.name.append(temp1.name);
}
}
int main(){
priority_queue<node> pq;
node b(23,"prashantandsoon..");
node a(22,"prashant");
node c(22,"prashantonly");
pq.push(b);
pq.push(a);
pq.push(c);
int size = pq.size();
for (int i = 0; i < size; ++i)
{
cout<<pq.top().age<<" "<<pq.top().name<<"\n";
pq.pop();
}
}
输出:
22 prashantonly
22 prashant
23 prashantandsoon..
我们可以定义用户定义的比较器:。下面的代码对您有帮助。
#include<bits/stdc++.h>
using namespace std;
struct man
{
string name;
int priority;
};
class comparator
{
public:
bool operator()(const man& a, const man& b)
{
return a.priority<b.priority;
}
};
int main()
{
man arr[5];
priority_queue<man, vector<man>, comparator> pq;
for(int i=0; i<3; i++)
{
cin>>arr[i].name>>arr[i].priority;
pq.push(arr[i]);
}
while (!pq.empty())
{
cout<<pq.top().name<<" "<<pq.top().priority;
pq.pop();
cout<<endl;
}
return 0;
}
输入:
蝙蝠侠2
悟空9
mario 4
输出量
悟空9
mario 4
batman 2