0

優先キューの私の定義は次のとおりです。

template<typename Node, typename Cmp = std::less<Node> >
struct deref_compare : std::binary_function<Node*,Node*,bool>
{
    deref_compare(Cmp const& cmp = Cmp())
    : cmp(cmp) {}

    bool operator()(Node* a, Node* b) const {
        return (a->getfValue()> b->getfValue());
    }

private:
    Cmp cmp;
};

typedef deref_compare<Node,std::greater<Node> > my_comparator_t;
priority_queue<Node*,vector<Node*>,my_comparator_t> openq; 

私がやっている:

openq.push(myNode)

3 ~ 4 個のノードに入ると、セグメンテーション エラーが発生します。

mynodeは空ではありません。

どうすれば解決できますか?

4

2 に答える 2

2

おなじみです

残念ながら、あなたはテンプレートを台無しにしました。ポインターを比較するための一般的な解決策が必要ない場合は、テンプレート マジックを使用せずにファンクターを作成することもできます。

struct my_compare {
    bool operator()(Node const* n1, Node const* n2) const {
        return n1->getfValue() > n1->getfValue();
    }
};

priority_queue<Node*,vector<Node*>,my_compare> foo;

あなたが得ているエラーについて。十分な情報が提供されませんでした。問題は、使用したファンクターではないようです。コードの残りの部分が原因である可能性が高くなります。

また、ノードが他のデータ構造 (std::set など) によって (ライフタイム管理のように) 管理され、ノードが十分に長く存続すること願っています。そうしないと、メモリ リークや未定義の動作につながる間違いを犯しやすくなります。自動オブジェクト (「スタック」上に存在するオブジェクト) は、スコープを離れると破棄され、別のコンテナー内に存在するオブジェクトへのポインターは、コンテナーを変更した後に無効になる可能性があることに注意してください。さまざまなコンテナーがイテレーターに関して行っている保証と、イテレーターがいつ/いつ無効になるかを確認してください。

于 2009-09-26T05:20:21.107 に答える
1

ノードを挿入するコードを確認する必要があります。ノードの 1 つが挿入後に破棄されているようです。おそらく、スタックベースのオブジェクトへのポインターを挿入していますか?

また、それは問題ではありませんが、あなたcmpは決して使用されておらず、常に大なり比較を行っています。

于 2009-09-26T02:51:13.033 に答える