我只是好奇,如果我可以有任何其他數據類型給予優先權?像字符串,浮游物等?優先級隊列的優先級總是需要是整數?
回答
摘要中,具有合理的Strict Weak Ordering的任何類型都可以用作優先級隊列中的優先級。您正在使用的語言將決定如何定義此排序:在C++中,運算符<用於標準容器中,在Java中,通常使用接口Comparable和函數compareTo。自定義比較函數也經常被支持,它可以以不同於默認的方式比較元素。
任何其他類型也可以使用(只要它滿足底層存儲容器的容器要求)。只有,那麼你需要在構造上指定排序謂詞。請參閱我的答案,瞭解如何執行這兩種方法。 (嗯,只是意識到我假設C++;但是,大多數其他平臺庫有類似的機制來指定比較器,例如在.NET中) – sehe
編號
優先級隊列的排序元素不必是整數。
是的。
您可以使用任何您想要的類型,只要可以比較該類型的兩個值以確定其固有順序即可。
基本上,你可以建立一個優先級隊列,使用你想要的任何類型,即使是一個複數,如果你可以確定一個有意義的順序。
有,但是,另一個沒有提出的,這裏的問題,對於這個問題的答案是:
是的,優先級隊列的大多數現有的實施將使用整數作爲排序元素,因爲這是最簡單的,和最常見的,用於此目的的價值。
如果類型的值可以相互比較,您可以使用任何類型的優先級。
這裏是一個茂盛的C++的如何排隊SillyJobs演示,所以在兩種方式定義爲
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
比較函數是一個不好的設計的很好的例子,但請記住它僅用於演示目的:)
- 1. 新近度是次要優先級的優先級隊列?
- 2. 優先級隊列中的優先級
- 3. 優先級隊列
- 4. 的Java:優先級隊列
- 5. 優先級和優先級
- 6. Java優先級隊列
- 7. PHP Sendmail隊列優先級
- 8. 雙重優先級隊列
- 9. Objective-c優先級隊列
- 10. 優先級隊列,可比
- 11. Amazon SQS優先級隊列
- 12. 關鍵 - 優先級隊列
- 13. 優先級隊列C
- 14. 樹和優先級隊列
- 15. 優先級隊列在python
- 16. 具有兩個優先級的優先級隊列Python
- 17. 具有動態項目優先級的優先級隊列
- 18. java優先級隊列隊列適應
- 19. 優先級隊列VS隊列
- 20. 如何將java優先級隊列轉換爲C++優先級隊列?
- 21. 優先級隊列數組(c)
- 22. 優先級隊列數據結構
- 23. 數據庫基於優先級隊列
- 24. STL優先級隊列構造函數
- 25. 優先級最高的優先隊列項目
- 26. 帶插入優先級的非優先隊列
- 27. 整數優先隊列
- 28. 優先上傳優先級,以高優先級使用HTB qdiscs
- 29. 優先級隊列的ArrayList HashMap的
- 30. 從陣列到優先級隊列
你沒有指定一種語言?答案是肯定的。你可以做任何你想要的東西 – sehe