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

也许这是 Boost.Bimap 的一个用例,其中两个键都是多集,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

正如 Ivaylo Strandjev 所说,您需要 bi* multi *map,实际上有一个。你需要的是

boost::bimap<multiset_of<User>, multiset_of<Client>>
于 2013-02-17T11:26:19.553 回答
0

实际上,您在这里需要的是一个双多图,我相信在 boost 中没有实现这样的东西。我的建议是你有一个map<int, vector<int> > user_clients(这里当然 map 也可能是unordered_map)和另一个 map: map<int, vector<int> > client_users。您必须使它们保持同步。可能为您创建一个包装类是最好的选择。

于 2013-02-17T11:21:55.563 回答