2012-03-17 5 views
5

私は実際にはより良いプログラマになろうと努力しており、よりモジュール化されたコードを作っています。C++で単純なオブジェクト指向グラフをプログラミングする

練習として、私はSTLと非常に単純なGraphクラスをC++で作成しようとしていました。下のコードでは、私のNodeオブジェクトはbecause the commented line results in a reference to a reference in STLをコンパイルしません。

#include <set> 

class KeyComparable 
{ 
public: 
    int key; 
}; 

bool operator <(const KeyComparable & lhs, const KeyComparable & rhs) 
{ 
    return lhs.key < rhs.key; 
} 

class Node : public KeyComparable 
{ 
public: 
    // the following line prevents compilation 
    // std::set<Node &> adjacent; 
}; 

それがキーでエッジの速い除去を可能にするので、私は(keyで)setのエッジを保存したいと思います。もし私がlist<Node*>を保存していればそれはうまくいくが、速い削除はkeyでできないだろう。

std::set<Node>を使用すると、エッジを変更するとローカルコピー(実際には隣接するNodeではなく)のみが変更されます。 std::set<Node*>を使用すると、<オペレーターは、ポインター自体で動作し、インデックスを作成するメモリでは動作しないため、動作するとは思われません。

私は別のクラス、おそらく私のKeyComparableクラス(リンクされたページによると、これはどのようにブーストがそれを処理するか)で参照またはポインタをラップすると考えました。

また、std::list<Node*>std::map<int, iterator>' of locations in the std :: listを格納することもできます。私はリストを変更するとイテレータが有効のままになるかはわかりません。

これまではすべてがポインタにすぎず、すべてのデータ構造を手動で処理していました。しかし、私が実際に使用するすべての言語でプログラミングCスタイルを停止したいと思っており、実際には良いプログラマになりました。

あなたはどう思いますが、この問題を処理するための最良のの方法ですか?どうもありがとう。あなたが推測したように格納されているアイテムの要件の一つは、彼らが割り当て可能であることであるので、

答えて

9

、あなたはSTLコンテナ内の参照を格納することはできません。 STLコンテナに配列を格納できないのと同じ理由があります。少なくとも1つがユーザー定義型でない場合でも演算子をオーバーロードすることはできません。そのため、STLクラスにポインタを格納するとカスタム比較ができないように見えます。

ただし、

struct NodePtrCompare { 
    bool operator()(const Node* left, const Node* right) const { 
     return left->key < right->key; 
    } 
}; 

std::set<Node*, NodePtrCompare> adjacent; 

そして、あなたが望むようにあなたはまだkeyにより高速な削除を取得する:あなたは、カスタム比較演算ファンクタをset与えればポインタをstd::setを使用しています。

+0

1良い答え。構造体に比較関数をラップすると、(関数ポインタよりも優れた構文を除いて)他にも利点がありますか? – user

+0

@Oliver私が本当に知っているわけではありません、この場合、それを行う唯一の方法です。私はそれが 'struct'をインスタンス化しなくても、インスタンスが同等になるため、グローバルにアクセス可能な'演算子< 'しかしときにすることができを有する好むだろう。 –

関連する問題