Общие варианты использования для контейнеров C ++ - PullRequest
26 голосов
/ 24 октября 2010

Каковы общие случаи использования для контейнеров стандартной библиотеки C ++ ?

  • BitSet
  • Deque
  • список
  • карта
  • MultiMap
  • мультимножеством
  • priority_queue
  • Очередь
  • набор
  • стек
  • вектор

Например, карта обычно лучше для парного поиска.

Ответы [ 2 ]

83 голосов
/ 24 октября 2010

Картинка стоит тысячи слов.

container choice flowchart

Он доступен из nolyc , информативного бота ## C ++ на Freenode, с помощью команды «выбор контейнера» или «containserchoice». Ссылка на эту картинку, которую вы получаете в ответ, размещена на adrinael.net , что говорит о том, что мы должны поблагодарить Adrinael , члена сообщества Freenode ## C ++.

14 голосов
/ 25 октября 2010

bitset - используется для хранения битов. Общее назначение - хранить значения некоторых флагов. Вам не нужно больше 1 бита для этого.

deque - двусторонняя очередь - push_back, push_front, pop_back и pop_front - методы базового класса. «Не отсортированный» (неупорядоченный) контейнер.

list - связанный список. Этот контейнер не является непрерывным в памяти. Время добавления и удаления элементов - O (1), но поиск конкретного элемента - O (n). Неупорядоченный контейнер.

map - контейнер, хранящий пары (std :: pair). Первый - это ключ - каждый элемент на карте должен иметь уникальный ключ. Карта представлена ​​в виде дерева, поэтому поиск элемента на карте - это n * log (n). Этот контейнер всегда сортируется, поэтому добавление и удаление элементов может занять больше времени - дерево (структура данных) является двоичным и сбалансированным.

multimap - почти то же самое, что и std :: map, но допускает пары с одинаковыми ключами. Например, мультикарта может содержать элементы: (666, "alabala"), (666, "asdfg"), в то время как стандартная std :: map не может. Этот контейнер также отсортирован.

multiset - снова - тоже самое, что установлено, но с повторяемыми элементами. установить - ну, это тоже всегда отсортированный контейнер STL. Например, набор равен {1, 2, 3}, и когда вы попытаетесь добавить '1' в этот набор, он не будет добавлен, поскольку такой элемент уже есть. (это аналог математического набора). Итак, мультимножество допускает несколько элементов с одинаковым значением, например, {1, 1, 1, 2, 3, 4, 4, 4, 4} является правильным мультимножеством, в то время как это , а не набор. Добавление и удаление элемента в std :: set по-прежнему является логарифмическим временем, поскольку оно представлено в виде двоичного, отсортированного и сбалансированного дерева.

priority_queue - его первый элемент всегда является самым большим из элементов, которые он содержит, согласно некоторому строгому условию слабого порядка. Основные функции - push_back и pop_back.

queue - Структура FIFO - Первый вошел, первый вышел. (или так же, как LILO - Last In - Last Out). Это аналог стандартной очереди - когда вы идете в магазин и начинаете ждать в очереди, первым будет идти первый. Вы можете просто push_back и pop_front. Неупорядоченный контейнер.

set - я уже описал это в разделе мультимножества.

stack - LIFO - Last In - First Out - стек. Базовая функциональность - push_back, pop_back. Неупорядоченный контейнер.

vector - аналог стандартного массива c ++. Он обрабатывается как обычный массив, он непрерывен в памяти и может быть передан в программу на C (передавая адрес первого элемента). Неупорядоченный контейнер.

ВАЖНОЕ ПРИМЕЧАНИЕ: Я описал базовую функциональность, а не всю. Прочитайте CPlusPlus.com для получения дополнительной информации.

...