2016-10-06 8 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 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)を呼び出します。

この関数は、関数オブジェクト(関数の例のように)、静的関数、またはラムダのいずれかで使用できる必要があります。あなたの最初のstructにはこれらのどれも含まれていません。任意の第三引数なし

priority_queue<node, vector<node>> queue; 

:あなたがこれを使用する必要がありますので、最初のケースで

1

は、nodeは、代わりに、それはoperator<ために過負荷を与えるよう—としてないコンパレータです。それはうまくいくはずです。

x < y 
:だから、そういう意味では、あなたのクラス nodeは、それが、しかし、これをサポート—ことをサポートしていません

cmp(x,y) 

コンパレータのように呼び出すことができるものであると

注意

これは別のもので、デフォルトのコンパレータstd::less<T>std::priority_queueで使用)で使用できます。

0

第3のテンプレート引数はcompareFunction(objA、objB)形式のみを受け入れるためです。デフォルトではclass Compare = std::less<typename Container::value_type>で、std :: lessは演算子<()を呼び出します。

次のコードがあるので、あなたのノードに

std::priority_queue<node, std::vector<node>> queue; 
関連する問題