122

を宣言しようとしていますが、コンパレータ関数としてpriority_queue of nodes使用bool Compare(Node a, Node b)しています (これはノード クラスの外部にあります)。

私が現在持っているものは次のとおりです。

priority_queue<Node, vector<Node>, Compare> openSet;

どういうわけか、私は得ていますError: "Compare" is not a type name

宣言を次のように変更しますpriority_queue <Node, vector<Node>, bool Compare>

私にくれますError: expected a '>'

私も試しました:

priority_queue<Node, vector<Node>, Compare()> openSet;
priority_queue<Node, vector<Node>, bool Compare()> openSet;
priority_queue<Node, vector<Node>, Compare<Node, Node>> openSet; 

my を正しく宣言するにはどうすればよいpriority_queueですか?

4

11 に答える 11

152

注 - 他の回答、特に decltype と lambda の回答を確認することもできます


クラスを宣言し、次のようCompareにオーバーロードする必要があります。operator()

class Foo
{

};

class Compare
{
public:
    bool operator() (Foo, Foo)
    {
        return true;
    }
};

int main()
{
    std::priority_queue<Foo, std::vector<Foo>, Compare> pq;
    return 0;
}

または、何らかの理由でクラスとして作成できない場合は、次のように使用できますstd::function

class Foo
{

};

bool Compare(Foo, Foo)
{
    return true;
}

int main()
{
    std::priority_queue<Foo, std::vector<Foo>, std::function<bool(Foo, Foo)>> pq(Compare);
    return 0;
}
于 2013-04-19T18:38:06.797 に答える
84

受け入れられた答えは、クラスまたはstd::functionコンパレーターとしての使用方法を示しています。cute_ptr の回答が既に示したように、関数ポインターを渡すこともできます。ただし、これを行うための構文は、そこに示されているよりもはるかに単純です。

class Node;
bool Compare(Node a, Node b);

std::priority_queue<Node, std::vector<Node>, decltype(&Compare)> openSet(Compare);

つまり、関数の型を明示的にエンコードする必要はありません。 を使用してコンパイラにエンコードさせることができますdecltype

コンパレータがラムダの場合、これは非常に便利です。を使用する以外の方法でラムダの型を指定することはできませんdecltype。例えば:

auto compare = [](Node a, Node b) { return a.foo < b.foo; }
std::priority_queue<Node, std::vector<Node>, decltype(compare)> openSet(compare);
于 2018-02-02T17:15:18.160 に答える
23

3 番目のテンプレート パラメーターは、オーバーロードされたクラスでなければなりませんoperator()(Node,Node)。したがって、次の方法でクラスを作成する必要があります。

class ComparisonClass {
public:
    bool operator() (Node, Node) {
        //comparison code here
    }
};

そして、このクラスを次のように 3 番目のテンプレート パラメーターとして使用します。

priority_queue<Node, vector<Node>, ComparisonClass> q;
于 2013-04-19T18:46:18.397 に答える
1

最新の C++ 標準では、コードをよりクリーンにするコンパレーターのラムダ関数を実際に宣言できます。サンプルコードは次のとおりです。

#include <queue>

class Foo
{
    public:
        int i;
};


int main()
{
    auto comparator = [](const Foo& a, const Foo& b) {
        return a.i > b.i;
    };

    std::priority_queue<Foo, std::vector<Foo>, decltype(comparator)>  pq(comparator);
    return 0;
}
于 2021-04-05T13:02:38.970 に答える