2011-11-05 231 views

回答

3

摘要中,具有合理的Strict Weak Ordering的任何類型都可以用作優先級隊列中的優先級。您正在使用的語言將決定如何定義此排序:在C++中,運算符<用於標準容器中,在Java中,通常使用接口Comparable和函數compareTo。自定義比較函數也經常被支持,它可以以不同於默認的方式比較元素。

+0

任何其他類型也可以使用(只要它滿足底層存儲容器的容器要求)。只有,那麼你需要在構造上指定排序謂詞。請參閱我的答案,瞭解如何執行這兩種方法。 (嗯,只是意識到我假設C++;但是,大多數其他平臺庫有類似的機制來指定比較器,例如在.NET中) – sehe

1

編號

優先級隊列的排序元素不必是整數。

是的。

您可以使用任何您想要的類型,只要可以比較該類型的兩個值以確定其固有順序即可。

基本上,你可以建立一個優先級隊列,使用你想要的任何類型,即使是一個複數,如果你可以確定一個有意義的順序。

有,但是,另一個沒有提出的,這裏的問題,對於這個問題的答案是:

是的,優先級隊列的大多數現有的實施將使用整數作爲排序元素,因爲這是最簡單的,和最常見的,用於此目的的價值。

0

如果類型的值可以相互比較,您可以使用任何類型的優先級。

1

這裏是一個茂盛的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 

觀摩上http://ideone.com/VEEQa

#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比較函數是一個不好的設計的很好的例子,但請記住它僅用於演示目的:)