какую структуру данных следует использовать multimap, boost :: bimap, multiset или любой другой

В моей программе есть несколько пользователей и их клиенты.
У меня есть список пользователей и связанных с ними клиентов.

пример

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

2

Решение

Возможно, это вариант использования 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 справа. (Обратите внимание, как обе стороны содержат повторяющиеся записи!)

1

Другие решения

Что вам нужно, так это на самом деле bimultimap, и я считаю, что в boost не реализовано ничего подобного. Я предлагаю вам иметь map<int, vector<int> > user_clients (здесь, конечно, карта может быть unordered_map) и другая карта: map<int, vector<int> > client_users, Вы должны будете синхронизировать их. Вероятно, создание класса-обертки для этого является лучшим вариантом.

0

Вам нужно би *много* карта, как сказал Ивайло Странджев, и на самом деле есть одна. Что вам нужно

boost::bimap<multiset_of<User>, multiset_of<Client>>
0
По вопросам рекламы [email protected]