2 つのフィールド (たとえば、A と B) を持つレコードがあります。As が等しい場合、レコードの 2 つのインスタンスは等しいと見なされます。一方、レコード インスタンスのコレクションは、B フィールドでソートする必要があります。
ソート用と一意性用の 2 つの異なる述語で定義できる std::set のようなコンテナはありますか? いいえの場合、どのように回避できますか?
よろしく、
標準ライブラリには、ユースケースを直接サポートするものはありません。ただし、この目的のためにBoost.MultiIndexContainerを使用できます。このようなもの:
typedef multi_index_container<
Record,
indexed_by<
ordered_non_unique<member<Record, decltype(Record::B), &Record::B>>,
hashed_unique<member<Record, decltype(Record::A), &Record::A>>
>
> RecordContainer;
(簡潔にするために正しいヘッダーとusing namespaceディレクティブを想定したコード)。
アイデアは、2 つのインデックスを持つコンテナーを作成することです。1 つは に基づいて順序付けを保証し、もう 1 つは にB基づいて一意性を保証しAます。もちろん、コード内の は、あなたが知っているとdecltype()の実際の型に置き換えることができますが、私はしません。AB
便宜上、コンテナー自体が最初のインデックスと同じインターフェイスを提供するため、インデックスの順序はわずかに重要です。ただし、を使用していつでも任意のインデックスにアクセスできますcontainer.get()。
このコードは、コピー & ペーストのソリューションとしてではなく、出発点としてのものです。カスタマイズ、インデックス タグなどを追加できます。詳細については、Boost のドキュメントを参照してください。
ソート用と一意性用の 2 つの異なる述語で定義できる、std::set のようなコンテナーはありますか?
std::set は、特定の要素が一意であるか、指定した並べ替え基準に関してそうでないかを定義します (デフォルトでは、 less<> を使用します) 。要素の等価性をチェックするための別の基準を明示的に渡す必要はありません。ただし、述語とアルゴリズムを使用して、std::set の要素が等しいかどうかを確認できます。