Контейнеры STL
Библиотека стандартных шаблонов (STL) ISO предоставляет контейнеры для хранения коллекций связанных объектов. Контейнеры — это классы шаблонов, которые содержат спецификацию объектов, разрешенных в контейнерах.
Примечание
Этот раздел не относится к библиотеке STL/CLR.Дополнительные сведения см. в разделе Справочные материалы по STL/CLR.
Контейнеры в библиотеке STL можно разделить на категории: последовательные контейнеры, ассоциативные контейнеры и контейнеры-адаптеры.
Последовательные контейнеры
Последовательные контейнеры поддерживают указанный пользователем порядок вставляемых элементов.
Контейнер vector ведет себя как массив, но может автоматически увеличиваться по мере необходимости. Он поддерживает прямой доступ и связанное хранение и имеет очень гибкую длину. По этим и многим другим причинам контейнер vector является наиболее предпочтительным последовательным контейнером для большинства областей применения. Дополнительные сведения см. в разделе Класс vector.
Контейнер array обладает некоторыми преимуществами контейнера vector, однако его длина не обладает такой гибкостью. Дополнительные сведения см. в разделе Класс array (STL).
Контейнер deque (двусторонняя очередь) обеспечивает быструю вставку и удаление в начале и в конце контейнера. Он, как и контейнер vector, обладает преимуществами прямого доступа и гибкой длины, но не обеспечивает связанное хранение. Дополнительные сведения см. в разделе Класс deque.
Контейнер list — это двунаправленный список, который обеспечивает двунаправленный доступ, быструю вставку и удаления в любом месте контейнера, но не поддерживает прямой доступ к элементам контейнера. Дополнительные сведения см. в разделе Класс list.
Контейнер forward_list — однонаправленный список. Это версия контейнера list только с доступом в прямом направлении. Дополнительные сведения см. в разделе Класс forward_list.
Ассоциативные контейнеры
В ассоциативных контейнерах элементы вставляются в предварительно определенном порядке — например, с сортировкой по возрастанию. Также доступны неупорядоченные ассоциативные контейнеры. Ассоциативные контейнеры можно объединить в два подмножества: сопоставления (set) и наборы (map).
Контейнер map, который иногда называют словарем, состоит из пар "ключ-значение". Ключ используется для упорядочивания последовательности, а значение связано с ключом. Например, map может содержать ключи, представляющие каждое уникальное ключевое слово в тексте, и соответствующие значения, которые обозначают количество повторений каждого слова в тексте. unordered_map — это неупорядоченная версия map. Дополнительные сведения см. в разделах Класс map и Класс unordered_map.
set — это контейнер уникальных элементов, упорядоченных по возрастанию. Каждое его значение также является и ключом. unordered_set — это неупорядоченная версия set. Дополнительные сведения см. в разделах Класс set и Класс unordered_set.
Контейнеры map и set разрешают вставку только одного экземпляра ключа или элемента. Если необходимо включить несколько экземпляров элемента, следует использовать контейнер multimap или multiset. Неупорядоченные версии этих контейнеров — unordered_multimap и unordered_multiset. Дополнительные сведения см. в разделах Класс multimap, Класс unordered_multimap, Класс multiset и Класс unordered_multiset.
Упорядоченные контейнеры map и set поддерживают двунаправленные итераторы, а их неупорядоченный аналоги — итераторы с перебором в прямом направлении. Дополнительные сведения см. в разделе Итераторы.
Контейнеры-адаптеры
Контейнер-адаптер — это разновидность последовательного или ассоциативного контейнера, который ограничивает интерфейс для простоты и ясности. Контейнеры-адаптеры не поддерживают итераторы.
Контейнер queue соответствует семантике FIFO (первым поступил — первым обслужен). Первый элемент, который отправляется, то есть вставляется, в очередь, должен быть первым элементом, извлекаемым из очереди. Дополнительные сведения см. в разделе Класс queue.
Контейнер priority_queue упорядочен таким образом, что первым в очереди всегда оказывается элемент с наибольшим значением. Дополнительные сведения см. в разделе Класс priority_queue.
Контейнер stack соответствует семантике LIFO (последним поступил — первым обслужен). Последний элемент, отправленный в стек, становится первым извлекаемым элементом. Дополнительные сведения см. в разделе Класс stack.
Поскольку контейнеры-адаптеры не поддерживают итераторы, их нельзя использовать в алгоритмах STL. Дополнительные сведения см. в разделе Алгоритмы.
Требования для элементов контейнеров
Как правило, элементы, вставленные в контейнер STL, могут быть практически любого типа объекта, если их можно копировать. Элементы, доступные только для перемещения — например, объекты vector<unique_ptr<T>>, создаваемые с помощью unique_ptr<>, — также можно использовать, если вы не вызываете функции-члены, которые пытаются скопировать их.
Деструктору не разрешено вызывать исключение.
Для упорядоченных ассоциативных контейнеров — ранее описанных в этом разделе — необходимо определить открытый оператор сравнения. (По умолчанию это оператор operator<, однако поддерживаются даже типы, которые не работают с operator<.)
Для некоторых операций в контейнерах может также потребоваться открытый конструктор по умолчанию и открытый оператор равенства. Например, неупорядоченным ассоциативным контейнерам требуется поддержка сравнения на равенство и хэширования.
Доступ к элементам контейнера
Доступ к элементам контейнеров осуществляется с помощью итераторов. Дополнительные сведения см. в разделе Итераторы.
Примечание
Для перебора коллекций STL можно также использовать циклы for на основе диапазонов.
См. также
Ссылки
Библиотека стандартных шаблонов
Потокобезопасность в стандартной библиотеке C++