2013-03-03 2 views
0

Я не слишком опытен с STL, поэтому я не уверен в лучшем подходе здесь.STL Векторизованная карта - Поиск лучшей практики

У меня есть набор действий, каждый из которых привязан к уникальному идентификатору. Чтобы я не дублировал действия, мне сначала захотелось сохранить их в std::map с ключом на идентификаторе. Тем не менее, мне нужно сохранить строгий порядок внутри a lastd::vector, так что когда я разматываю свои действия, они появляются в порядке, в котором они были добавлены.

Любой приведенный список действий может быть от одного или двух элементов до нескольких тысяч. Смогу ли я что-нибудь потерять, если я переключусь на ручную проверку vector на дубликаты (т. Е. Итерации и идентификаторы checikng)? Или есть какая-то форма map или другой контейнер, который я могу использовать, что позволяет мне искать по ID, но не внутренне сортирует или повторно заказывает мои элементы?

+2

Один грубый вариант - это просто использовать оба;) –

ответ

2

Возможно, вы захотите использовать карту boost:multi_index, которая может поддерживать порядок вставки для карты.

struct Item 
{ 
     string name; 
     int data; 
}; 
struct ItemTag {}; 
typedef multi_index_container< 
    Item, 
    indexed_by< 
     random_access<>, // this index represents insertion order 
     hashed_unique< tag<ItemTag>, member<Item, string, &Item::name> > 
    > 
> ItemsMap; 
+0

Спасибо, это похоже на решение. Однако (и это может быть ересь!), Я в настоящее время не использую Boost, и это похоже на довольно тяжелую библиотеку, чтобы привлечь только для решения этой проблемы (это в основном приложение MFC, в котором я пытаюсь привести STL с новыми дополнениями, но я не модернизирую существующие вещи «CArray» и «CMap»). – Kyudos

+0

Тогда я бы предложил использовать обе коллекции (map + vector) одновременно. Карта даст вам быстрый поиск, и вектор сохранит заказ. – nogard

+0

Простите меня за то, что вы плотный, но вы имеете в виду использование «карты» исключительно для проверки на поиск/дублирование и «вектор» для хранения (или, возможно, [deque] (http://www.linuxsoftware.co.nz/) containerchoice.png), что мне нужно после этого)? Итак, мой компромисс немного увеличен (возможно) благодаря моей «карте» идентификаторов 'int'? – Kyudos

2

Звуки мне, что вам нужно Boost.MultiIndex

подпиточные многоиндексная контейнеры Библиотека обеспечивает шаблонный класс с именем multi_index_container, который позволяет строительство контейнеров, поддерживающих один или несколько индексов с различными сортировками и доступом к семантике , Индексы предоставляют интерфейсы, аналогичные интерфейсам контейнеров STL, что делает их знакомыми. Концепция мультииндексации по одному и тому же набору элементов заимствована из терминологии реляционных баз данных и позволяет специфицировать сложные структуры данных в духе многократно индексированных реляционных таблиц, где недостаточно простых множеств и карт. Предоставляется широкий выбор индексов, смоделированных после аналогичных STL-контейнеров, таких как std :: set, std :: list и хешированные наборы.

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