Какой контейнер STL для заказанных данных с основанным на ключе доступом?

Скажем, у меня есть набор объектов Человека, каждый из которых похож на это:

class Person 
{
  string Name;
  string UniqueID;
}

Теперь, объекты должны храниться в контейнере, который позволяет мне заказывать им так, чтобы я мог, данный объект X легко определяет местоположение объекта X+1 и X-1.

Однако мне также нужен быстрый доступ на основе UniqueID, поскольку количество будет большим, и линейный поиск не сократит его.

Мое текущее 'решение' состоит в том, чтобы использовать станд.:: список в сочетании со станд.:: карта. Список содержит Людей (для заказанного доступа), и карта используется для отображения UniqueID на ссылку на элемент списка. Обновление 'контейнера' обычно включает обновление и карта и список.

Это работает, но я чувствую, что должен быть более умный способ сделать его, возможно boost:bimap. Предложения?

Править: Существует некоторый беспорядок о моем требовании для "упорядочивания". Для объяснения объекты передаются потоком в последовательно из файла, и 'порядок' объектов в контейнере должен соответствовать порядку файла. Порядок не связан с идентификаторами.

9
задан Roddy 12 July 2010 в 15:46
поделиться

3 ответа

boost:bimap - самый очевидный выбор. bimap основан на boost::multi_index, но bimap имеет упрощенный синтаксис. Лично я предпочту boost::multi_index, чем boost::bimap, потому что это позволит в будущем легко добавить больше индексов в структуру Person.

8
ответ дан 4 December 2019 в 12:59
поделиться

Почему бы не использовать две карты, одна с Person в качестве ключа, а другая с UniqueId в качестве ключа, но для этого необходимо обновить их обе.

вы можете создать функцию обратного вызова, которая обновляет обе карты при каждом изменении.

1
ответ дан 4 December 2019 в 12:59
поделиться

Не существует контейнера Стандартной библиотеки, который делает то, что вы хотите - поэтому вам придется использовать два контейнера или решение Boost. При использовании двух контейнеров я бы обычно предпочел вектор или deque, а не список, почти во всех обстоятельствах.

7
ответ дан 4 December 2019 в 12:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: