Как реализовать карту с очередями? - PullRequest
4 голосов
/ 03 августа 2009

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

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

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

Ответы [ 3 ]

12 голосов
/ 03 августа 2009

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

3 голосов
/ 03 августа 2009

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

1 голос
/ 03 августа 2009

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

  • Edit- Нейл побил меня этим, реквизит пошел к нему:)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...