В моей программе есть несколько пользователей и их клиенты.
У меня есть список пользователей и связанных с ними клиентов.
пример
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
Возможно, это вариант использования 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
справа. (Обратите внимание, как обе стороны содержат повторяющиеся записи!)
Что вам нужно, так это на самом деле bimultimap, и я считаю, что в boost не реализовано ничего подобного. Я предлагаю вам иметь map<int, vector<int> > user_clients
(здесь, конечно, карта может быть unordered_map
) и другая карта: map<int, vector<int> > client_users
, Вы должны будете синхронизировать их. Вероятно, создание класса-обертки для этого является лучшим вариантом.
Вам нужно би *много* карта, как сказал Ивайло Странджев, и на самом деле есть одна. Что вам нужно
boost::bimap<multiset_of<User>, multiset_of<Client>>