1

私の質問を提示するために、一連のポインター(同じタイプ)があると仮定しましょう

                                {p1, p2, ..., pn} 

それらにアクセスするには異なるアクセス戦略が必要なため、それらを複数のコンテナーに保存したいと思います。リンク リストとハッシュ テーブルの 2 つのコンテナーにそれらを格納するとします。リンクされたリストの場合は順序があり、ハッシュ テーブルの場合は高速アクセスがあります。さて、問題は、あるコンテナーからポインターを削除すると、他のコンテナーから削除することを覚えておく必要があることです。これにより、コードの保守が難しくなります。問題は、このような状況を管理するための他のパタ​​ーンまたはデータ構造があるかということです。ここでスマートポインターが役立ちますか?

4

5 に答える 5

2

いつものように、サポートを容易にするために、このロジックを分離してみてください。安全なパブリックインターフェイスを備えたいくつかの小さなクラス(申し訳ありませんが、これをコンパイルしませんでした。これは単なる擬似コードです)。

template<class Id, Ptr>
class Store
{
public:
   void add(Id id, Ptr ptr)
   {
      m_ptrs.insert(ptr);
      m_ptrById.insert(std::make_pair(id, ptr));
   }

   void remove(Ptr ptr)
   {
      // remove in sync as well
   }

private:
   std::list<Ptr> m_ptrs;
   std::map<Id, Ptr> m_ptrById;
};

次に、Storeを使用してポインターの同期を維持します。

于 2013-02-07T06:57:58.560 に答える
2

std::listとの両方を含む独自のクラスを作成し、アクセス関数を提供し、とで線形に、およびでランダムにstd::unordred_mapアクセスできるように削除関数を提供してみませんか。削除は両方のコンテナから削除され、挿入は両方に挿入します。(一種のラッパークラス:P)listunordred_map

また、の使用を検討し、データ構造を常に希望どおりに順序付けておく比較機能を提供することstd::mapもできます。また、アクセス時間で要素にランダムにアクセスできます。log N

于 2013-02-07T06:53:56.747 に答える
0

私があなたの問題を正しく理解していれば、メモリ管理 (新規/削除の問題) にあまり関心がなく、どの要素が有効かどうかの実際の「簿記」に関心があります。

そこで、各ポイントを「参照カウンター」でラップすることを考えていました

 template< class Point >
 class BookKeeping {
 public:
     enum { LIST_REF = 0x01,
            HASH_REF = 0x02 };
     BookKeeping( const Point& p ): m_p(p), m_refCout( 0x3 ) {} // assume object created in both containers
     bool isValid() const { return m_refCount == 0x3; } // not "freed" from any container
     void remove( unsigned int from ) { m_refCount = m_refCount & ! from ; }
 private:
     Point m_p;
     unsigned int m_refCount;
 };
于 2013-02-07T06:51:35.897 に答える
0

この同様の質問に対する回答 (今のところ唯一のもの) を参照してください。その場合、 OP はシーケンスの最後でのみ挿入/削除したいため、dequea の代わりに a が提案されます。list

いずれにしても、Boost Multi-index Containers Libraryを使用することをお勧めします。

于 2013-02-07T10:19:13.540 に答える