Эта шпаргалка предоставляет довольно хорошую сводку различных контейнеров.
Видят блок-схему в нижней части как руководство, на котором можно использовать в различных сценариях использования:
Созданный David Moore и лицензируемый CC SA 3.0
Простой ответ: используйте std::vector
для всего, если у Вас нет настоящей причины, чтобы сделать иначе.
, Когда Вы находите случай, где Вы думаете, "Ну и дела, std::vector
не работает хорошо здесь из-за X", идут основание X.
Взгляд на Эффективный STL Scott Meyers. Это способно объяснять, как использовать STL.
, Если Вы хотите сохранить решительное/неопределенное количество объектов и Вы никогда не собираетесь удалять любого, тогда вектор - то, что Вы хотите. Это - замена по умолчанию для массива C, и это работает как одно, но не переполняется. Можно установить его размер заранее также с резервом ().
, Если Вы хотите сохранить неопределенное количество объектов, но Вы будете добавлять их и удалять их, тогда Вы, вероятно, хотите список..., потому что можно удалить элемент, не перемещая никакого после элементов - в отличие от вектора. Требуется больше памяти, чем вектор, тем не менее, и Вы не можете последовательно получить доступ к элементу.
, Если Вы хотите взять набор элементов и найти только уникальные значения тех элементов, читая их всех в набор, сделает это, и это отсортирует их для Вас также.
, Если у Вас есть много пар "ключ-значение", и Вы хотите отсортировать их по ключу, тогда карта полезна..., но это будет только содержать одно значение на ключ. При необходимости больше чем в одном значении на ключ Вы могли бы иметь вектор/список как свое значение в карте или использовать мультикарту.
Это не находится в STL, но это находится в обновлении TR1 STL: если у Вас есть много пар "ключ-значение", которые Вы собираетесь искать ключом, и Вы не заботитесь об их порядке, Вы могли бы хотеть использовать хеш - который является tr1:: unordered_map. Я использовал его с Visual C++ 7.1, где это назвали stdext:: hash_map. Это имеет поиск O (1) вместо поиска O (зарегистрируйте n) для карты.
Все это зависит от того, что Вы хотите сохранить и что Вы хотите сделать с контейнером. Вот некоторые (очень неисчерпывающие) примеры для контейнерных классов, которые я склонен использовать больше всего:
vector
: Компактное расположение с минимальной памятью наверху на содержащий в нем объект. Эффективный для итерации. Добавьте, вставьте и сотритесь, может быть дорогим, особенно для сложных объектов. Дешевый для нахождения содержащего в нем объекта индексом, например, myVector[10]. Используйте, где Вы использовали бы массив в C. Хороший, где у Вас есть много простых объектов (например, интервал). Не забывайте использовать reserve()
прежде, чем добавить много объектов к контейнеру.
list
: Маленькая память наверху на содержащий в нем объект. Эффективный для итерации. Добавьте, вставьте и сотритесь, являются дешевыми. Используйте, где Вы использовали бы связанный список в C.
set
(и multiset
): Значительная память наверху на содержащий в нем объект. Используйте, где необходимо узнать быстро, если тот контейнер содержит данный объект или контейнеры слияния эффективно.
map
(и multimap
): Значительная память наверху на содержащий в нем объект. Используйте, где Вы хотите сохранить пары "ключ-значение" и искать значения ключом быстро.
блок-схема на шпаргалка предложенный zdan предоставляет более исчерпывающее руководство.
Один урок, который я извлек: Попытайтесь обернуть его в класс, начиная с изменения типа контейнера, один прекрасный день может привести к большим неожиданностям.
class CollectionOfFoo {
Collection<Foo*> foos;
.. delegate methods specifically
}
Это не стоит многого впереди и экономит время в отладке, когда Вы хотите повредиться каждый раз, когда кто-то делает операцию x на этой структуре.
Прибытие в выбор идеальной структуры данных для задания:
Каждая структура данных обеспечивает некоторые операции, которые могут варьироваться временная сложность:
O (1), O (lg N), O (N), и т.д.
по существу необходимо взять лучшее предположение, на котором операции будут сделаны больше всего и использовать структуру данных, которая начинает ту операцию как O (1).
Простой, не он (-: