簡體   English   中英

為什么不能將比較器放在節點內部?

[英]Why can't I put the comparator inside the node?

我正在使用priority_queue解決問題。 我打算通過以下方式聲明我的節點。

struct node{
         int x, y, val;
         node(int _x, int _y, int _val){
             x = _x;
             y = _y;
             val = _val;
         }
         bool operator < (const node& rhs) const{
             return val > rhs.val;
         }
     };

並以以下方式使用它:

priority_queue<node, vector<node>, node> queue;

但這是行不通的。

然后,我切換到另一種方式。 有用。

struct node{
         int x, y, val;
         node(int _x, int _y, int _val){
             x = _x;
             y = _y;
             val = _val;
         }

     };
struct com{
    bool operator () (const node& lhs, const node& rhs) const{
             return lhs.val > rhs.val;
         }
};
priority_queue<node, vector<node>, com> queue;

我不知道為什么會有區別。 任何建議都很好。

給定以下答案,我嘗試了多種方式來運行我的代碼,它們可以工作:

版本1

struct node{
         int x, y, val;
         node(int _x, int _y, int _val){
             x = _x;
             y = _y;
             val = _val;
         }
         node(){}

        bool operator () (const node& lhs, const node& rhs) const{
         return lhs.val > rhs.val;
     }
 };

priority_queue<node, vector<node>, node> queue;

版本2:

struct node{
         int x, y, val;
         node(int _x, int _y, int _val){
             x = _x;
             y = _y;
             val = _val;
         }
    bool operator < (const node& rhs) const{
         return val > rhs.val;
     }

 };
priority_queue<node, vector<node>, less<node>> queue;
//or
//priority_queue<node, vector<node>> queue;
//or
//priority_queue<node> queue;

node不是默認可構造的,並且沒有operator()

由於您使用的是operator< ,因此無需指定比較器,因為默認值是std::less<T> ,如果可用,它將使用它。 而且,如果不需要指定比較器,則無需指定容器,因為std::vector<T>已經是默認設置。

priority_queue<node, vector<node>, less<node>> queue; 
// same as
priority_queue<node, vector<node>> queue;
// also same as
priority_queue<node> queue;

在第一種情況下, node本身不是比較器,而是為operator<提供了重載,因此您應該使用以下方法:

priority_queue<node, vector<node>> queue;

沒有任何第三論點。 那應該工作。

請注意, 比較器是可以通過以下方式調用的比較器

cmp(x,y)

因此,從這個意義上講,您的類node不支持該功能,但是它支持以下功能:

x < y

這是另一回事,因此可以與std::priority_queue使用的默認比較器std::less<T>使用。

priority_queue在評估期間從字面上調用com(arg1, arg2)

該函數需要作為函數對象(在您的示例中有效),靜態函數或lambda可用。 您的第一個struct沒有這些。

因為第三個模板參數僅接受compareFunction(objA,objB)格式。 默認情況下,它是class Compare = std::less<typename Container::value_type> ,其中std :: less調用operator <()。

下面的代碼應該工作

std::priority_queue<node, std::vector<node>> queue;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM