2009-08-03 2 views
4

Проблема: я хочу иметь возможность отправлять сообщения в очередь FIFO. По причинам, связанным с обновлением/удалением, я также хочу иметь доступ к каждому сообщению в очереди на основе идентификатора объекта.Как реализовать карту в очереди?

В настоящее время я реализовал решение, в котором данные вставляются в deque, и итератор к этим данным сохраняется. Итератор, привязанный идентификатором объекта, затем помещается в карту. Это было прекрасно в одном месте, где я это делал, но теперь я хочу сделать это в другом месте.

Я слишком усложняю проблему? Есть ли структура данных, которая делает это уже?

+0

Я думаю, чтобы сделать это лучше, мы должны были бы знать, что вы делаете. Обычно, когда вы толкаете что-то в очередь, вас беспокоит только фронт. Вам не нужно изменять его. – GManNickG

ответ

12

Почему бы не сделать deque deque ID и отобразить карту с ID на объект. Затем, когда вы получаете доступ к идентификатору в deque, вы просматриваете ID на карте. Если идентификаторы глобально уникальны, вам нужна только одна карта для обслуживания всех требований.

+0

Сначала я избегал такого решения, потому что он не позволял мне удалять узлы в очереди на основе идентификатора. Тогда я понял, что это не обязательно. Когда очередь, наконец, обрабатывает узел, отображаемые данные могут решить, что делать. Либо ключ был удален, либо вызов объекта данных решает, что его больше не нужно обрабатывать. –

1

Я бы попробовал работать наоборот. Используйте карту как свою основную структуру данных. У очереди есть идентификаторы объектов, которые можно использовать для поиска объекта с карты. Вам не нужно будет отслеживать всю эту дополнительную информацию в отношении итераторов и т. Д. - просто карту ваших данных и очередь идентификаторов объектов.

  • Edit- Нил избил меня к нему, реквизита пойти к нему :)
3

Я использовал Boost.MultiIndex, чтобы сделать что-то очень похожее. Используя его, вы можете иметь контейнер, который имеет данные только один раз, но к нему можно получить доступ через два (или более!) фасадов: тот, который выглядит как список, и другой, который ведет себя как карта. Когда вы удаляете элемент, используя один фасад (например, pop из списка), другое представление будет обновляться без проблем.

+0

То же самое, за исключением того, что я использовал boost.bimap (карты с двумя индексами, один для приоритета, другой для «ObjectID»). – timday

Смежные вопросы