2

私のプログラムには、何人かのユーザーとそのクライアントがいます。ユーザーとそれに関連するクライアントのリストがあります。

U1 -> c1, c2, c3, c5, c8, c10, c12
U2 -> c3, c5, c13, c8, c12, c14
U3 -> C2, C5, c8, c11, c12, c14
..
...
....
.....
and many more.

一部のクライアントは、ユーザーのリストで一般的です。

クライアントからユーザーへの逆階層を作りたい。いずれかのクライアントに更新が発生した場合、その更新は、クライアントが関連付けられているユーザーにのみ適用されます。

どのデータ構造を使用する必要があるかを教えてくださいmap、multimap、boost :: bimap、multiset

4

3 に答える 3

1

おそらくこれは、両方のキーがマルチセットであり、bimapのエントリがユーザーとクライアント間の単一の接続を表すBoost.Bimapのユースケースです。したがって、次のセットアップでは

U1 -> C1 C2 C3
U2 -> C4 C1
U3 -> C5 C1

エントリ、、、、、、、(U1, C1)および(U1, C2)があります。(U1, C3)_(U2, C4)(U2, C1)(U3, C5)(U3, C1)

U1, U1, U1, U2, U3両方のキーを順番に、つまり左側とC1, C1, C1, C2, C3, C4, C5右側でトラバースできます。(両側に繰り返しエントリが含まれていることに注意してください!)

于 2013-02-17T11:27:53.253 に答える
0

ここで必要なのは実際にはバイマルチマップであり、ブーストでそのようなものは実装されていないと思います。私が提案するのは、あなたがmap<int, vector<int> > user_clients(ここではもちろん地図もそうかもしれませんunordered_map)そして別の地図を持っているということです:map<int, vector<int> > client_users。それらの同期を維持する必要があります。おそらく、それを行うためのラッパークラスを作成するのが最良のオプションです。

于 2013-02-17T11:21:55.563 に答える
0

Ivaylo Strandjevが言ったように、 bi * multi * mapが必要ですが、実際には1つあります。必要なのは

boost::bimap<multiset_of<User>, multiset_of<Client>>
于 2013-02-17T11:26:19.553 に答える