私は問題を解決するために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;
に動作する必要があり、それが定義されている '演算子()'ではありません。 'std :: less'を使って動作させるか、単にコンパイラを省略することができます。 –
StoryTeller
'node'構造の比較演算子と' com'構造の関数呼び出し演算子に違いはありませんか? ***比較演算子***と他の***関数呼び出し***演算子のように? –
最初の例では余分なテンプレート引数は必要ありません。デフォルトの 'std :: less'が' <'演算子を使うためです。したがって、最初の例で必要なのは 'priority_queue queue;' –