Проблема множественной ассоциации с C ++ - PullRequest
0 голосов
/ 26 ноября 2009

Как бы вы решили эту проблему? (Сначала это казалось простым, потом я обнаружил, что это озадачивает).

  • У вас есть класс с именем Executor. Предположим, у вас есть много экземпляров этого, и они делают разные вещи после вызова метода do (Аргумент).
  • Аргумент имеет 2 различных параметра, и это A * pa, B * pb (один из которых может быть нулевым)
  • Теперь мне нужен менеджер классов, который получает значения аргументов и перенаправляет их в соответствующий экземпляр Executor (давайте назовем этот метод Filter). Это делается после того, как некоторое время назад каждый исполнитель вызывал метод Manager.subscribe (A * pa, B * pb), чтобы сказать, кому из них интересно. Обратите внимание: если pa или (не оба) pb равны NULL, это означает, что ЛЮБОЙ (я имею в виду, если pa равен NULL, проверяется только pb). Конечно, не должно быть более одного исполнителя.
  • Реализация должна быть БЫСТРАЯ, идеал должен быть вектором или чем-то похожим на хеш-карту ... НО СРАВНЕНИЕ ДОЛЖНО БЫТЬ СДЕЛАНО СОДЕРЖАНИЕМ pa и pb, а не их значением как указателей.
  • Наконец, возможно, что подписка может быть отменена исполнителем (не ожидая слишком долго). В любом случае я хочу, чтобы фильтр, подписка и отмена подписки выполнялись очень быстро.

Я думал о многих аранжировках, с хэш-картами, списками и мультикартами ... Но всем им не хватает скорости, легкости или чего-то еще. Что бы вы сделали?

1 Ответ

2 голосов
/ 26 ноября 2009

Я думаю, что вы хотите создать класс с именем «Подписка», который представляет отдельную подписку от исполнителя до менеджера, содержащую информацию о том, при каких условиях будет вызываться эта подписка, а также какой-либо GUID или имя для этой подписки. , Я думаю что-то вроде

 class Subscription
 {
   GUID g;
   A_filter a;
   B_filter b;
   Executor *e;
 }

В подписке также есть метод «Проверить», должен ли он срабатывать на основе заданных значений для A и B, а затем вызывать исполнителя по этим параметрам, если он совпадает.

В этом случае класс Manager будет содержать три карты, одна из которых является «Руководством по картам для подписки» *, и позволит очень быстро отписываться, в основном ищет GUID в запросе отказа от подписки, чтобы получить объект подписки, используйте этот объект, чтобы определить, какие значения для Возможно, потребуется удалить A и B с карты A и B, а затем удалить объект. Подписаться - это просто создание объекта подписки и добавление значений на карту Guid, A Map и B Map.

Выполняя поиск на основе (A, B), если A или B имеет значение NULL, вы выполняете поиск в другой хэш-таблице и запускаете возвращаемую подписку. Если ни A, ни B не равны нулю, все становится сложнее.

Здесь нужно найти пересечение наборов, возвращаемых путем поиска A и поиска B. Это можно сделать вручную, но более быстрый способ может заключаться в том, чтобы иметь одну дополнительную карту, ключ которой B добавлен к A.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...