2016-10-06 57 views
0

我正在使用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; 
+0

,它不是'操作符()'被定義。你可以使用'std :: less '來使其工作,或者只是省略了編譯器。 – StoryTeller

+3

您是否注意到'node'結構中的比較運算符和'com'結構中的函數調用運算符之間有什麼區別?像一個是***比較運算符***,另一個是***函數調用***運算符? –

+1

不是你需要第一個例子中的額外的模板參數,因爲那麼將會使用使用'<'運算符的默認'std :: less'。所以在第一個例子中,你需要的是'priority_queue 隊列;' –

回答

5

node不是默認並且它沒有operator()

由於y您正在使用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; 
0

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

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

1

在第一種情況,node比較器作爲這樣—相反,它提供了一種過載operator<,因此應使用這樣的:

priority_queue<node, vector<node>> queue; 

沒有任何第三個參數。這應該工作。

注意,一個比較是一個可以調用爲:

cmp(x,y) 

所以在這個意義上說,你node類不支持—它,但是,支持此:

x < y 

這是一個不同的東西,因此,可以與std::priority_queue使用的默認比較器std::less<T>一起使用。

0

因爲第三個模板參數只接受compareFunction(objA,objB)格式。默認情況下,它是class Compare = std::less<typename Container::value_type>,std :: less調用運算符<()。

下面的代碼應該因爲你的節點工程

std::priority_queue<node, std::vector<node>> queue; 
相關問題