В котором сценарии я использую конкретный контейнер STL?

Я читал на контейнерах STL в моей книге по C++, конкретно раздел по STL и его контейнерам. Теперь я действительно понимаю, что у каждого из них есть их собственные определенные свойства, и я близко к запоминанию всех их... Но то, что я еще не схватываю, находится, в котором сценарии используется каждый из них.

Каково объяснение? Пример кода очень предпочтен.

178
задан Jonas 18 November 2019 в 20:17
поделиться

5 ответов

Эта шпаргалка предоставляет довольно хорошую сводку различных контейнеров.

Видят блок-схему в нижней части как руководство, на котором можно использовать в различных сценариях использования:

http://linuxsoftware.co.nz/containerchoice.png

Созданный David Moore и лицензируемый CC SA 3.0

322
ответ дан Peter Mortensen 23 November 2019 в 20:13
поделиться

Простой ответ: используйте std::vector для всего, если у Вас нет настоящей причины, чтобы сделать иначе.

, Когда Вы находите случай, где Вы думаете, "Ну и дела, std::vector не работает хорошо здесь из-за X", идут основание X.

39
ответ дан YSC 23 November 2019 в 20:13
поделиться

Взгляд на Эффективный STL Scott Meyers. Это способно объяснять, как использовать STL.

, Если Вы хотите сохранить решительное/неопределенное количество объектов и Вы никогда не собираетесь удалять любого, тогда вектор - то, что Вы хотите. Это - замена по умолчанию для массива C, и это работает как одно, но не переполняется. Можно установить его размер заранее также с резервом ().

, Если Вы хотите сохранить неопределенное количество объектов, но Вы будете добавлять их и удалять их, тогда Вы, вероятно, хотите список..., потому что можно удалить элемент, не перемещая никакого после элементов - в отличие от вектора. Требуется больше памяти, чем вектор, тем не менее, и Вы не можете последовательно получить доступ к элементу.

, Если Вы хотите взять набор элементов и найти только уникальные значения тех элементов, читая их всех в набор, сделает это, и это отсортирует их для Вас также.

, Если у Вас есть много пар "ключ-значение", и Вы хотите отсортировать их по ключу, тогда карта полезна..., но это будет только содержать одно значение на ключ. При необходимости больше чем в одном значении на ключ Вы могли бы иметь вектор/список как свое значение в карте или использовать мультикарту.

Это не находится в STL, но это находится в обновлении TR1 STL: если у Вас есть много пар "ключ-значение", которые Вы собираетесь искать ключом, и Вы не заботитесь об их порядке, Вы могли бы хотеть использовать хеш - который является tr1:: unordered_map. Я использовал его с Visual C++ 7.1, где это назвали stdext:: hash_map. Это имеет поиск O (1) вместо поиска O (зарегистрируйте n) для карты.

10
ответ дан Mark Krenitsky 23 November 2019 в 20:13
поделиться

Все это зависит от того, что Вы хотите сохранить и что Вы хотите сделать с контейнером. Вот некоторые (очень неисчерпывающие) примеры для контейнерных классов, которые я склонен использовать больше всего:

vector: Компактное расположение с минимальной памятью наверху на содержащий в нем объект. Эффективный для итерации. Добавьте, вставьте и сотритесь, может быть дорогим, особенно для сложных объектов. Дешевый для нахождения содержащего в нем объекта индексом, например, myVector[10]. Используйте, где Вы использовали бы массив в C. Хороший, где у Вас есть много простых объектов (например, интервал). Не забывайте использовать reserve() прежде, чем добавить много объектов к контейнеру.

list: Маленькая память наверху на содержащий в нем объект. Эффективный для итерации. Добавьте, вставьте и сотритесь, являются дешевыми. Используйте, где Вы использовали бы связанный список в C.

setmultiset): Значительная память наверху на содержащий в нем объект. Используйте, где необходимо узнать быстро, если тот контейнер содержит данный объект или контейнеры слияния эффективно.

mapmultimap): Значительная память наверху на содержащий в нем объект. Используйте, где Вы хотите сохранить пары "ключ-значение" и искать значения ключом быстро.

блок-схема на шпаргалка предложенный zdan предоставляет более исчерпывающее руководство.

3
ответ дан Bids 23 November 2019 в 20:13
поделиться

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

class CollectionOfFoo {
    Collection<Foo*> foos;
    .. delegate methods specifically 
}

Это не стоит многого впереди и экономит время в отладке, когда Вы хотите повредиться каждый раз, когда кто-то делает операцию x на этой структуре.

Прибытие в выбор идеальной структуры данных для задания:

Каждая структура данных обеспечивает некоторые операции, которые могут варьироваться временная сложность:

O (1), O (lg N), O (N), и т.д.

по существу необходимо взять лучшее предположение, на котором операции будут сделаны больше всего и использовать структуру данных, которая начинает ту операцию как O (1).

Простой, не он (-:

2
ответ дан Dominic Hofer 23 November 2019 в 20:13
поделиться
Другие вопросы по тегам:

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