1

std::multimapキーとその値が同じ型である場合、意味はありますか?

実際のコードはもっと複雑ですが、たとえば、クラスがPointあり、そのタイプの類似オブジェクトを見つけたいとします。

bool
ComparePoints::operator()(Point* const p1, Point* const p2) const {
  if (p1->x > p2->x) return false;
  if (p1->x < p2->x) return true;
  ...
  return false;
}

そのために with 比較関数を使用std::multimapし、MultiMap::equal_range を使用してオブジェクトのグループを取得できます。

std::multimap<Point*, Point*, ComparePoints> pointsMap;

これは私にとってはうまくいきますが、値フィールドが冗長になっているように感じます。より良い解決策を探す必要がありますか?

編集:

オブジェクトからまったく同じオブジェクトにマッピングしています

pointsMap.insert(std::pair<Point*, Point*>(p, p));

値を冗長にするので、@johnが述べたように、代わりに std::multiset を使用する必要があります。

4

2 に答える 2

1

意味あり。

たとえば、私が所有するレストランに特定の近接内にある都市のすべてのレストランを相互参照したいと考えています。このデータ構造のデータ型は同じですが、エンティティのグループ化はビジネス ロジックと基準において重要です。

ハッシュ データ型を使用している場合、基本的に共通キーによってオブジェクトをグループ化しています。キーが同じタイプかどうかは関係ありません。「この 1 つの参照ポイントですべてのポイントをグループ化したい」と言うのは、そのデータ型の正当な使用法です。

于 2013-10-03T13:30:21.540 に答える
1

あなたのプログラムでそれが理にかなっていれば、確かにそれは理にかなっています。

multimap値が重複していても、標準は気にしません。

23.3.2 クラステンプレートのマルチマップ

1/マルチマップは、同等のキー (同じキー値の複数のコピーを含む可能性がある) をサポートし、キーに基づいて別の型 T の値を高速に取得できる連想コンテナーの一種です。

multimap クラスは、双方向反復子をサポートします。

問題は、これが言語の観点から理にかなっているかどうかではなく、あなたがやろうとしていることに意味があるかどうかです。

1 つのキーに関連付けられた特定の値のアイテムの数をカウントする必要がある場合、これは理にかなっていることがわかります。おそらく、それぞれの値は等しいと比較されても、異なる属性を持っている可能性があります (例: 名前に基づいて等しいかどうかが決定される学生名簿。ばかげているかもしれませんが、可能性があります)。

重複する値を持つマップとハッシュ マップの間には、少なくともある程度の類似点があることがわかりました。明らかな違いもいくつかありますが、そのうちの少なくともドメインの適用性ですがmultimap、重複した値を持つことを検討している場合、実際にはハッシュマップが必要になる可能性があると私が考えるのに十分な類似性があります( unordered_mapC++ 11)。

于 2013-10-03T13:29:50.227 に答える