私は実際にはより良いプログラマになろうと努力しており、よりモジュール化されたコードを作っています。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
スタイルを停止したいと思っており、実際には良いプログラマになりました。
あなたはどう思いますが、この問題を処理するための最良のの方法ですか?どうもありがとう。あなたが推測したように格納されているアイテムの要件の一つは、彼らが割り当て可能であることであるので、
1良い答え。構造体に比較関数をラップすると、(関数ポインタよりも優れた構文を除いて)他にも利点がありますか? – user
@Oliver私が本当に知っているわけではありません、この場合、それを行う唯一の方法です。私はそれが 'struct'をインスタンス化しなくても、インスタンスが同等になるため、グローバルにアクセス可能な'演算子< 'しかしときにすることができを有する好むだろう。 –