順序付けと等価性のために別々の関数を指定できるコンテナを探しています。std::set
コンパレータ機能を1つ指定可能。理想的には基準で並べ替えたいのですが、セットを検索して、別の基準を使用して一致させたいと考えています。セットに挿入された反復子を格納するマップを使用して、このソリューションをハッキングしました。しかし、もっと良い方法があるかどうか疑問に思っています。
2 に答える
試してくださいboost::multi_index_container
: http://www.boost.org/doc/libs/1_53_0/libs/multi_index/doc/index.html
Boost Multi-index Containers Library は、multi_index_container という名前のクラス テンプレートを提供します。これにより、異なる並べ替えとアクセス セマンティクスを持つ 1 つ以上のインデックスを維持するコンテナーの構築が可能になります。インデックスは、STL コンテナーのインターフェイスと同様のインターフェイスを提供するため、使い慣れたものになります。要素の同じコレクションに対するマルチインデックスの概念は、リレーショナル データベースの用語から借用されたものであり、単純なセットとマップでは不十分な複数インデックスのリレーショナル テーブルの精神で、複雑なデータ構造の指定を可能にします。std::set、std::list、ハッシュ セットなどの類似の STL コンテナーをモデルにした、幅広いインデックスが提供されています。
Boost.MultiIndex は、サブオブジェクト検索、範囲クエリ、要素のインプレース更新などの追加機能を備えているため、マルチインデックス機能が必要ない場合でも、std::set および set::multiset の便利な代替品になります。
あなたが求めているものを的確にサポートします。複数の並べ替えに関するセクションを参照してください。
2 つのコンテナー (手動で同期を維持する) を使用するか、else を使用しますboost::multi_index
。
a 内の要素set
が再配置されることはなく、反復子が無効化されることもないため、key->iterator のマップを使用したソリューションは、おそらく他の 2 コンテナー ソリューションとほぼ同じくらい優れています。代わりに key->pointer のマップを保存することもできます。
もちろん、 のみを使用して、またはstd::set
を使用して要素を検索することもできます。検索には、セットのサイズに比例して時間がかかります。std::find
std::find_if