我只是好奇我是否可以使用任何其他数据类型来优先考虑?像字符串,花车等?
答案 0 :(得分:3)
在摘要中,任何具有合理Strict Weak Ordering的类型都可以用作优先级队列中的优先级。您正在使用的语言将决定如何定义此排序:在C ++中,运算符<在Java中使用标准容器,通常使用接口Comparable和function compareTo。还经常支持自定义比较函数,它可以以不同于默认值的方式比较元素。
答案 1 :(得分:1)
没有
优先级队列的排序元素不必是整数。
是
您可以使用您想要的任何类型,只要可以比较该类型的两个值以确定它们的固有顺序。
基本上,您可以构建一个使用您想要的任何类型的优先级队列,如果您可以确定对这些类型有意义的排序,即使是复杂的数字。
然而,这里有另一个未提出的问题,答案是:
是的,优先级队列的大多数现有实现都将使用整数作为排序元素,因为这是用于此目的的最简单,最常见的值。
答案 2 :(得分:1)
这是一个关于如何排队SillyJobs的完整C ++演示,定义为
struct SillyJob
{
std::string description;
std::string priority;
// ...
};
它以两种方式实现:使用成员operator<
(默认)并将显式比较谓词传递给priority_queue
构造函数。
让我们先看看输出:
Silly: (by description length)
LOW: very very long description
HIGH: short
------------------------------------------------------------
Not so silly: (by priority value)
HIGH: short
LOW: very very long description
上查看
#include <queue>
#include <algorithm>
#include <functional>
#include <iostream>
#include <string>
#include <map>
struct SillyJob
{
std::string description;
std::string priority;
SillyJob(const std::string& d, const std::string& p)
: description(d), priority(p) { }
bool operator<(const SillyJob& sj) const { return description.size() < sj.description.size(); }
friend std::ostream& operator<<(std::ostream& os, const SillyJob& sj)
{ return os << sj.priority << ": " << sj.description; }
};
static bool by_priority(const SillyJob& a, const SillyJob& b)
{
static std::map<std::string, int> prio_map;
if (prio_map.empty())
{
prio_map["HIGH"] = 3;
prio_map["MEDIUM"] = 2;
prio_map["LOW"] = 1;
}
return prio_map[a.priority] < prio_map[b.priority];
}
int main()
{
std::cout << "Silly: (by description length)" << std::endl;
{
// by description length (member operator<)
std::priority_queue<SillyJob> silly_queue;
silly_queue.push(SillyJob("short", "HIGH"));
silly_queue.push(SillyJob("very very long description", "LOW"));
while (!silly_queue.empty())
{
std::cout << silly_queue.top() << std::endl;
silly_queue.pop();
}
}
std::cout << std::string(60, '-') << "\nNot so silly: (by priority value)" << std::endl;
{
// by description length (member operator<)
typedef bool (*cmpf)(const SillyJob&, const SillyJob&);
typedef std::priority_queue<SillyJob, std::vector<SillyJob>, cmpf> not_so_silly_queue;
not_so_silly_queue queue(by_priority);
queue.push(SillyJob("short", "HIGH"));
queue.push(SillyJob("very very long description", "LOW"));
while (!queue.empty())
{
std::cout << queue.top() << std::endl;
queue.pop();
}
}
}
PS。 by_priority
比较函数是糟糕设计的一个很好的例子,但请记住它仅用于演示目的:)
答案 3 :(得分:0)
如果可以将类型的值相互比较,则可以使用任何类型作为优先级。