2012-04-19 8 views
2

私はこの問題を何時間も悩まされていますが、私が見ていない簡単な解決策があると感じています。私は私が定義した構造体へのポインタのMinHeapを作成するためにpriority_queueを使用しようとしています。私の問題は、priority_queueテンプレートと一致させるために、この構造体へのポインタのために>演算子をオーバーロードしなければならないということです。これは私の最後のリゾートの試みで、私はそれを捨てて自分自身のヒープコードを書くことにする前に、stl priority_queueを使用しようとしています。構造体へのポインタの演算子のオーバーロードを回避するには? C++

私のコードの関連するスニペットがある:(i)の部分構造体の定義:

typedef struct Node Node; 
struct Node 
{ 
    int frequency; 
    bool operator>(const Node& other) const{ 
     return frequency > other.frequency; 
    } 
}; 

(ⅱ)優先度キューの初期化:

priority_queue<Node*,vector<Node*>,greater<Node*> > q; 

および(iii)の構築forループ初期ヒープ(int_array初期化されていると仮定):現在

for (int i = 0; i < SIZEOFINTARRAY; i++) 
{ 
    Node *n = new Node; 
    n->frequency = int_array[i]; 
    q.push(n); 
} 

、THIの要素s "heap"はFIFOで返され​​、ソートは行われません。これは、優先度の比較でポインタと配列の前の要素がメモリ内にあるかどうかをチェックするためです。どのように私がこれを達成できるかについてのヒントを教えてください。

PS。この投稿がstackoverflowの標準に準拠していない場合は申し訳ありません(私はルールに従うように最善を尽くしましたが、それは私の最初の投稿です)。私はすべての批判を歓迎するので、私は再び同じミスを繰り返すことはできません。

+0

なぜNodeをキューの値型として使用できないのですか?これはC++でタグ付けされているので、 'typedef struct Node Node;の必要はありません。また、構造体にも構造体が含まれているため、Node structに型を保存するためのコンストラクタを与えてください。 – stijn

+0

@stijn私がここから除外したいくつかのNode *メンバー。これらのNode *メンバーはまた、後でコード内でキューを再構築する必要があるため(Nodeがコードをハフマンエンコーディングしている) – sebo

+0

あなたがあなたのスワップを実装しても、ノード、いいえ?それがパフォーマンスの問題を引き起こしますか? – stijn

答えて

3

一般的な方法は、ちょうどstd::greaterのようですが、逆参照deref_greaterの並べ替えを実装するだろう最初にargsを入力します。

template<class T> 
struct deref_greater : public std::binary_function<T, T, bool> 
{ 
    bool operator()(const T& _Left, const T& _Right) const 
    { 
    return *_Left > *_Right; 
    } 
}; 
2

のではなく、あなたのNodeクラスに>演算子をオーバーロード、あなたがNode*ポインタのためのコンパレータを実現することができます。

struct NodeGreater 
{ 
    bool operator() (const Node* lhs, const Node* rhs) const 
    { 
     if (lhs == 0 || rhs == 0) 
     { 
      // Perhaps throw an exception here... 
     } 

     return lhs->frequency > rhs->frequency; 
    } 
}; 

priority_queue<Node*,vector<Node*>,NodeGreater> q; 
+0

それは魅力的に機能しました。どうもありがとうございました。 私はpriority_queueに慣れていないと思うし、自分のコンパレータを作成して、クラスのテンプレートのCompareスロットで使うことができるかどうか分からなかった。これは良い学習経験です。 – sebo

+0

あなたは大歓迎です。 – Nick

関連する問題