2

C++priority_queueでクラスを作成したいと考えています。Edge

そのために、edgeCompare次のようにコンパレータークラスを作成しました。

class edgeCompare{
public:
    map<int, glm::mat4x4> * Qmap;

    edgeCompare(const map<int, glm::mat4x4> & Qm){
        * Qmap = Qm;
    }

    bool operator() (const Edge & e1, const Edge & e2) const{
        // code that compares and returns corresponding bool
        // OBS: in this function I use *Qmap
    }
}

ご覧のとおり、比較を行うには外部変数が必要です。

Apriority_queueは通常、次のように宣言されます。

priority_queue<Edge, vector<Edge>, edgeCompare> pq;

しかし、私の場合、edgeComparator変数を使用してを構築する必要がありますQmap

どのように進めればよいですか?

どうもありがとう!

4

3 に答える 3

3

テンプレート パラメータはコンパレータの型です。それでも、コンパレーターのインスタンスを priority_queue コンストラクターに渡す必要があります。その時点で、任意のパラメーターを使用してコンパレーター インスタンスを構築できます。

例えば:

map<int, glm::mat4x4> m;
edgeCompare comp(m);
priority_queue<Edge, vector<Edge>, edgeCompare> pq(comp);

オブジェクトをインラインで作成することもできますがedgeCompare、あいまいさをなくすために余分な括弧が必要です。

priority_queue<Edge, vector<Edge>, edgeCompare> pq((edgeCompare(m)));
于 2013-11-29T18:28:53.840 に答える
2

クラスでoperator==operator!=operator>およびoperator<をオーバーロードして、コンパレータでそれらを比較できるようにします。Edgee1 == e2

また、から派生しないでくださいstd::map。デストラクタがないためvirtual、そこから派生させるのはお勧めできません。

マップをクラスのプライベート メンバーとして持つだけです。

于 2013-03-10T18:23:43.593 に答える
2

このリンク hereによると、priority_queueのコンストラクターで述語を渡すことができるオーバーロードがあります。

于 2013-03-10T18:25:08.483 に答える