Карта с несколькими ключами в C++

Я хочу хранить данные как по имени, так и по индексу. Другими словами, я хочу сопоставить имена string с объектами, а также задать им пользовательский порядок.

Сначала я придумал std::vector пар string ключа и объекта. Порядок задавался положением в векторе.

std::vector<std::pair<std::string, object> >

Но этот подход кажется неоптимальным, поскольку он не проверяет автоматически уникальность string имен. Более того, кажется неправильным сначала группировать объекты по их порядку, потому что логически их первым порядковым отличием является имя.

Мне нужна структура данных, которая разрешает доступ как по имени, так и по индексу.

std::magic<std::string, unsigned int, object> collection;

// access by either string or unsigned int key
collection.insert("name", 42, new object());
collection["name"]
collection[42]

Существует ли уже структура данных для этого варианта использования? Если нет, то как мне его собрать, предпочтительно используя стандартную библиотеку? Также мне нужен способ вставлять новые элементы в позицию после данного элемента, не перемещая все остальные элементы.


person danijar    schedule 06.04.2013    source источник
comment
Вам нужны два объекта std::map.   -  person n. 1.8e9-where's-my-share m.    schedule 06.04.2013
comment
@н.м. Мне не нужно заказывать по имени строки. Так что в основном мне нужно std::vector для порядка и std::unordered_map для имен. Но мой вопрос в том, есть ли уже решение или хотя бы предпочтительный способ.   -  person danijar    schedule 06.04.2013
comment
unordered_map возможно, если вы используете C++11. Для индексов выбор между vector и map/unordered_map определяется тем, что должно произойти, когда вы удаляете вещи из своей коллекции. Если вам не нужны стабильные индексы, вы можете использовать vector. Я думаю, что два контейнера являются предпочтительным способом.   -  person n. 1.8e9-where's-my-share m.    schedule 06.04.2013
comment
Возможно, boost.org/doc/libs/1_53_0/libs /multi_index/doc/index.html   -  person    schedule 06.04.2013
comment
Посмотрите на boost::multiindex, он был сделан именно для этой цели.   -  person Chad    schedule 06.04.2013
comment
@Чад Это то, что я искал! Если вы напишете ответ, я отмечу его как принятый.   -  person danijar    schedule 06.04.2013


Ответы (1)


Boost предоставляет набор контейнеров именно для этой цели, см.: boost::multiindex

person Chad    schedule 08.04.2013