質問

何が最良の方法(C++セットアップコンテナをダブル割出?具体的には、リストオブジェクトの各物価連動によるキーが複数の当たりを尊重できる方が希望です。このmultimap.ここではそれよりも悪化以上に直線のルックアップの位置のオブジェクトです。むしろ重複を避けながらのデータにおいては、各オブジェクトを維持することは自分の座標に移動そのものにすることに悪までもないと自分のオブジェクトに間接的に呼びデストラクタの一員としてのキ).されているのではないかと思い一部のコンテナを維持する指標によるオブジェクトのポインタの調整、オブジェクト自体の保証安定した参考文献/ポインタ.各オブジェクトが店序で繰り返し処理する反復子インデックスを含む座標)ので、十分抽出したいです。が進みました。MultiIndexのように考えると、非常に怖い思wany私の実際のオブジェクトの必要のconst.

何をお勧めになりますか。

編集:ブBimapう気がすい形で安定的に割り出?る場合、変更したいの座標だけでなく、他の要素でなければならないので有効になります。その理由を利用したいポイント割出しでオブジェクトにはない固有の順序は、ポインタを一定に制御することができなオブジェクトの変更が可能とその利用を押し上げMultiIndex、IIRC、安定した割出).

役に立ちましたか?

解決

いくつかの仮定に基づくwriteup:

  • キー格安でコピーとの比較
  • あるオブジェクトのコピーのシステム
  • 同じキーを参照して多くのオブジェ、オブジェクトに対応する指定された鍵(つく)
  • ていきたいへの効率的に見る物に対応し、指定された鍵、キーに対応する指定されたオブジェクト

思考:

  • 利用には、リンクリスト又はその他のコンテナの維持にグローバルリストのすべてのオブジェクトのシステム。の割り当てられるリンク一覧です。
  • トの作成 std::multimap<Key, Object *> このマップのキーにオブジェクトのポインタを指摘し、シングル標準のリンク一覧です。
  • いずれかの操作を行います:
    • トの作成 std::map<Object *, Key> この見出しのキー装着の特定のオブジェクトです。確認コードの更新をこのマップがキーが変更されます。(これにも std::multimap が必要な場合は、多対多関係です。)
    • 追加のメンバー変数に Object が含まれる電流 Key (O(1)ルックアップ).確認コードの更新はこの変数の場合はキーが変更されます。

からwriteup記"座標"をキーについての提案で トされている場合は、見つける3次元座標が既に使用.

他のヒント

その理解し難いように確認することができますが、そのような強 bimap あると考えている。では基本的に向マルチ-インデックス以外の特定の使用の場合、使いやすくしてできる高速検索の最初の要素または第二の要素となります。なぜ今日の位置のオブジェクトはマップにより、そのアドレス?利用の抽象化を及ぼす場合がありますので、全てのおまかせください。ただ注意:繰り返し処理すべての要素を地図はO(N)この保証はO(N)ないがにをお考えの方はそれができていました。

一つのオプションは利用std::図参照shared_ptrs.のようなことがい:

template<typename T, typename K1, typename K2>
class MyBiMap
{
public:
    typedef boost::shared_ptr<T> ptr_type;

    void insert(const ptr_type& value, const K1& key1, const K2& key2)
    {
        _map1.insert(std::make_pair(key1, value));
        _map2.insert(std::make_pair(key2, value));
    }

    ptr_type find1(const K1& key)
    {
        std::map<K1, ptr_type >::const_iterator itr = _map1.find(key);
        if (itr == _map1.end())
            throw std::exception("Unable to find key");
        return itr->second;
    }

    ptr_type find2(const K2& key)
    {
        std::map<K2, ptr_type >::const_iterator itr = _map2.find(key);
        if (itr == _map2.end())
            throw std::exception("Unable to find key");
        return itr->second;
    }

private:
    std::map<K1, ptr_type > _map1;
    std::map<K2, ptr_type > _map2;
};

編集:私だけかれていることにお気づきのmultimap、このものを表現してうってしまいます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top