2009-08-03 7 views
1

私は特にC++を扱っていますが、これは本当に言語に依存しません。オブジェクトからアイテムのコレクションを取得するベストプラクティス?

問題にいくつかのコンテキストを与える...私は、各ノードが複数のアイテムの集合を保持するツリー/グラフベースの構造を持っています。

私はいくつかの一般的なコレクション(リスト、マップ、ベクトル、LinkedList、何でも)をカプセル化するクラスを持っています。クライアントがプライベートコレクションを編集することなく、できるだけ効率的な方法でコレクションからすべてのアイテムを取得できるようにしたい。だから、明らかに

class MyClass 
{ 
public: 
    // Basic constructors and such 
    void AddItem(int item) { _myItems->push_back(item); } 

private: 
    list<int>* _myItems; 
}; 

これは、クライアントが_myItemsを編集することができますように動作しない_myItemsへのポインタを取得し、ゲッター:

は、ここで私が持っているものの簡単な例です。

試み1:
私は新しいリストを作成して、代わりにその1へのポインタを返すことができます...しかし、私が作成し、現在、削除の責任として、そのアイデア好きではない別のオブジェクトとうそ。

試み2:私はそれのようないくつかのCopyToのメソッドを作成するのがベストだろうと思ってい

void CopyItemsToList(list<int>* inList) { // copy the items to client list } 

この方法では、クライアントは、MEM管理の世話をする、拡張するのは簡単ですこれにより、より多くのデータ構造が可能になります。このアプローチの私の関心は、リストは非常に大きなものとなります...コストで、アイテムをコピーするコストが

試み3大得ることができます:
代わりのクラスのリストへのポインタを保持し、値の型を使用してそれを返します(コピーコンストラクタに処理させる)。しかし、これはパフォーマンスのコストが#2と同じように思えます...

とにかく、これについて他の方法はありますか?皆さんの考えを教えてください...ありがとう。

答えて

6

Iterator patternは、一般に、コレクションの不可知論から要素のリストをコレクションの実際の内部表現に公開する適切な方法と考えられています。読み取り専用(const)参照を返すような方法でイテレータを作成したり、リスト全体をコピーするのではなく要求されたときにその場でアイテムのコピーを作成することができます。

+0

const_teratorそれで、クライアントは要素自体を変更することはできません。 – Eugene

+0

修正;更新された答えは、それについてもう少し明白になります。 – Amber

+0

Meh。大量のデータを考慮して多くの作業が行われているようなサウンドは、既に繰り返し処理できるリストの周りに構築されています。 – Kieveli

2

ポインタの代わりにconst参照を返すことができます(または単にconstのポインタ)。クライアントは引き続きconstキャストすることができますが、これはそれ自体の問題になります。

const list<int>& GetList() const { return *_myItems; } 
+1

これは、クラス外の実装の詳細を公開している。 .. –

+0

プライベートな実装パターンを使用し、ゲッターコードをヘッダーから移動します。しかし、イテレーターは真の方法です。 – Eugene

0

ただ、リストのコピーを返します。

list<int> GetList() { return *_myItems; } 

は時期尚早最適化しないでください。それはすべての悪の根です。

関連する問題