Скажем, у меня есть набор объектов Человека, каждый из которых похож на это:
class Person
{
string Name;
string UniqueID;
}
Теперь, объекты должны храниться в контейнере, который позволяет мне заказывать им так, чтобы я мог, данный объект X легко определяет местоположение объекта X+1 и X-1.
Однако мне также нужен быстрый доступ на основе UniqueID, поскольку количество будет большим, и линейный поиск не сократит его.
Мое текущее 'решение' состоит в том, чтобы использовать станд.:: список в сочетании со станд.:: карта. Список содержит Людей (для заказанного доступа), и карта используется для отображения UniqueID на ссылку на элемент списка. Обновление 'контейнера' обычно включает обновление и карта и список.
Это работает, но я чувствую, что должен быть более умный способ сделать его, возможно boost:bimap
. Предложения?
Править: Существует некоторый беспорядок о моем требовании для "упорядочивания". Для объяснения объекты передаются потоком в последовательно из файла, и 'порядок' объектов в контейнере должен соответствовать порядку файла. Порядок не связан с идентификаторами.
boost:bimap
- самый очевидный выбор. bimap
основан на boost::multi_index
, но bimap
имеет упрощенный синтаксис. Лично я предпочту boost::multi_index
, чем boost::bimap
, потому что это позволит в будущем легко добавить больше индексов в структуру Person
.
Почему бы не использовать две карты, одна с Person в качестве ключа, а другая с UniqueId в качестве ключа, но для этого необходимо обновить их обе.
вы можете создать функцию обратного вызова, которая обновляет обе карты при каждом изменении.
Не существует контейнера Стандартной библиотеки, который делает то, что вы хотите - поэтому вам придется использовать два контейнера или решение Boost. При использовании двух контейнеров я бы обычно предпочел вектор или deque, а не список, почти во всех обстоятельствах.