|
|
| Строка 1: |
Строка 1: |
| {{Стандартная библиотека C++}}
| | '''Последовательными контейнерами''' в языке программирования [[C++]] считаются несколько предопределённых шаблонных [[тип данных|типов данных]]. Каждый из элементов такого контейнера имеет определённую позицию, которая зависит от времени и места помещения его в контейнер, но не зависит от значения элемента. Как правило, к последовательным контейнерам относятся списки, вектора, очереди двустороннего доступа, массивы (начиная со стандарта [[C++11]]) и ряд других. Обычно их реализуют на практике в виде связанного списка или массива. |
| '''Последовательными контейнерами''' ({{lang-en|Sequence containers}}) в языке программирования [[C++]] считаются несколько предопределённых [[шаблоны C++|шаблонных]] [[тип данных|типов данных]] [[Стандартная библиотека языка C++|стандартной библиотеки]] ''STL'', которые обеспечивают упорядоченный способ хранения своих элементов. Каждый из элементов такого контейнера имеет определённую позицию, которая зависит от времени и места помещения его в контейнер, но не зависит от значения элемента. Как правило, к последовательным контейнерам относятся списки, вектора, очереди двустороннего доступа, массивы (начиная со стандарта [[C++11]]) и ряд других. Обычно их реализуют на практике в виде связанного списка или массива{{sfn|Josuttis|2012|loc=Containers|p=167—168}}{{sfn|Литвиненко|2005|loc=Стандартная библиотека шаблонов STL|с=137}}. | |
|
| |
|
| == Описание ==
| |
| Все основные стандартные классы-контейнеры библиотеки ''STL'' подразделяются на последовательные и [[ассоциативный контейнер|ассоциативные контейнеры]]. Ключевое отличие последовательных контейнеров от ассоциативных заключается в том, что при помещении элемента в последовательный контейнер он остаётся там, где его разместили, а в ассоциативном он перемещается туда, где ему положено находиться в соответствии со внутренним устройством контейнера{{sfn|Meyers|2001|loc = Containers|p=16}}.
| |
|
| |
| Традиционно в категорию стандартных последовательных контейнеров входят массивы <code>array</code>, списки (как односвязные <code>forward_list</code>, так и двусвязные <code>list</code>), динамические вектора <code>[[vector (C++)|vector]]</code> и очереди <code>deque</code>{{sfn|Josuttis| 2012|loc=Sequence containers|p=169}}<ref>[http://www.cplusplus.com/reference/stl/ Containers] {{Wayback|url=http://www.cplusplus.com/reference/stl/ |date=20200114100116 }} www.cplusplus.com</ref><ref>[https://www.geeksforgeeks.org/containers-cpp-stl/ Containers in C++ STL] {{Wayback|url=https://www.geeksforgeeks.org/containers-cpp-stl/ |date=20200112213345 }} www.geeksforgeeks.org</ref>. Иногда в их состав также включают строки <code>[[string (C++)|string]]</code>, а к нестандартным последовательным контейнерам относят списки <code>slist</code> и строковые данные <code>rope</code>{{sfn|Meyers|2001|loc = Containers|p=11}}.
| |
|
| |
| == Требования к элементам ==
| |
| Основная технологическая оснастка библиотеки ''STL'' (контейнеры, итераторы, алгоритмы) реализована в виде шаблонных классов. Как следствие, эта инфраструктура может одинаково эффективно обрабатывать как встроенные, так и пользовательские типы данных. Тем не менее, все элементы всех контейнеров библиотеки ''STL'' должны подчиняться ряду достаточно общих требований. Во-первых, они должны быть [[семантика перемещения|перемещаемыми]] и копируемыми. Во-вторых, к ним должно быть допустимо применение операции присваивания. В-третьих, для их уничтожения должен быть доступен [[деструктор]]. В дополнение к этим требованиям ряд последовательных контейнерных классов требует наличия [[конструктор по умолчанию|конструктора по умолчанию]], а в некоторых методах может потребоваться определённая операция сравнения на равенство <code>operator==()</code> для элементов{{sfn|Josuttis|2012|loc=Requirements for Container Elements|p=244}}{{sfn|Posch, Galowicz|2018|loc = Sequence containers|p=14}}.
| |
|
| |
| == Базовый функционал ==
| |
|
| |
| С основными последовательными контейнерами связан набор стандартных операций, поддерживаемых всеми классами библиотеки ''STL'' для унифицированного доступа к своим элементам{{sfn|Шлее|2015 |loc=Последовательные контейнеры|с=96}}.
| |
|
| |
| {| class="wikitable"
| |
| |-
| |
| ! Название !! Функции
| |
| |-
| |
| | <code>+</code> || Объединение элементов
| |
| |-
| |
| | <code>+=</code> || Добавление элементов в контейнер
| |
| |-
| |
| | <code><<</code> || Добавление элемента в контейнер
| |
| |-
| |
| | <code>at()</code> || Доступ к произвольному элементу
| |
| |-
| |
| | <code>front()</code> и <code>first()</code> || Предоставляют ссылку на первый элемент в предположении, что он существует. Использование метода <code>front()</code> предпочтительнее по стандарту ''STL''.
| |
| |-
| |
| | <code>back()</code> и <code>last()</code> || Предоставляют ссылку на последний элемент в предположении, что он существует. Использование метода <code>back()</code> предпочтительнее по стандарту ''STL''.
| |
| |-
| |
| | <code>contains()</code> || Проверка контейнера на наличие переданного элемента
| |
| |-
| |
| | <code>erase()</code> || Удаляет элемент, на который указывает параметр-итератор
| |
| |-
| |
| | <code>IndexOf()</code> || Возвращает индекс первого элемента, который соответствует значению переданного параметра.
| |
| |-
| |
| | <code>pop_front()</code> || Удаляет из контейнера первый элемент
| |
| |-
| |
| | <code>pop_back()</code> || Удаляет из контейнера последний элемент
| |
| |-
| |
| | <code>replace()</code> || Заменяет значение элемент контейнера на значение своего параметра
| |
| |-
| |
| | <code>push_front()</code> и <code>prepend()</code> || Добавляют элемент в начало контейнера. Использование метода <code>push_front()</code> предпочтительнее по стандарту ''STL''.
| |
| |-
| |
| | <code>push_back()</code> и <code>append()</code> || Добавляют элемент в конец контейнера. Использование метода <code>push_back()</code> предпочтительнее по стандарту ''STL''.
| |
| |}
| |
|
| |
| В дополнение к ним важной операцией считается функция <code>resize()</code>, которая позволяет динамически варьировать количество элементов в коллекции за линейное время. Её поддерживают все классы, за исключением массива <code>array</code>, который идеологически не предназначен для изменений своего размера в памяти{{sfn|Josuttis|2012|loc=Containers|p=176}}.
| |
|
| |
| == Примечания ==
| |
| {{примечания}}
| |
|
| |
| == Источники ==
| |
| * {{публикация|книга |автор= Литвиненко
| |
| |автор имя= Н. А.
| |
| |автор линк=
| |
| |автор2=
| |
| |автор2 имя=
| |
| |автор2 линк=
| |
| |заглавие= Технология программирования на С++
| |
| |подзаголовок= Начальный курс
| |
| |ссылка=
| |
| |архив=
| |
| |архив дата=
| |
| |ответственный=
| |
| |издание=
| |
| |место= {{СПб.}}
| |
| |издательство= «БХВ-Петербург»
| |
| |год= 2005
| |
| |страницы=
| |
| |страниц= 288
| |
| |удк= 681.3.068Ь800.92С++(075.8)
| |
| |ббк= 32.973.26-018.1я73
| |
| |isbn= 5-94157-655-2
| |
| |ref= Литвиненко
| |
| }}
| |
| * {{публикация|книга |автор= Шлее
| |
| |автор имя= М.
| |
| |автор линк=
| |
| |автор2=
| |
| |автор2 имя=
| |
| |автор2 линк=
| |
| |заглавие= Qt 5.3
| |
| |подзаголовок= Профессиональное программирование на С++
| |
| |ссылка=
| |
| |архив=
| |
| |архив дата=
| |
| |ответственный=
| |
| |издание=
| |
| |место= {{СПб.}}
| |
| |издательство= «БХВ-Петербург»
| |
| |год= 2015
| |
| |страницы=
| |
| |страниц= 928
| |
| |удк= 004.438С++
| |
| |ббк= 32.973.26-018.1
| |
| |isbn= 978-5-9775-3346-1
| |
| |ref= Шлее
| |
| }}
| |
| * {{публикация|книга |язык= en
| |
| |автор= Josuttis
| |
| |автор имя= N. M.
| |
| |автор линк=
| |
| |автор2=
| |
| |автор2 имя=
| |
| |автор2 линк=
| |
| |заглавие= The C++ Standard Library
| |
| |подзаголовок= A Tutorial and Reference
| |
| |ссылка=
| |
| |архив=
| |
| |архив дата=
| |
| |ответственный=
| |
| |издание= 2nd
| |
| |место=
| |
| |издательство= Addison-Wesley
| |
| |год= 2012
| |
| |pages=
| |
| |allpages=
| |
| |isbn= 978-0-321-62321-8
| |
| |oclc=
| |
| |ref= Josuttis
| |
| }}
| |
| * {{публикация|книга |язык= en
| |
| |автор= Meyers
| |
| |автор имя= S.
| |
| |автор линк=
| |
| |автор2=
| |
| |автор2 имя=
| |
| |автор2 линк=
| |
| |заглавие= Effective STL
| |
| |подзаголовок= 50 Specific Ways to Improve Your Use of the Standard Template Library
| |
| |ссылка=
| |
| |архив=
| |
| |архив дата=
| |
| |ответственный=
| |
| |издание= 2nd
| |
| |место=
| |
| |издательство= Addison-Wesley
| |
| |год= 2001
| |
| |pages=
| |
| |allpages=
| |
| |isbn= 0-201-74962-9
| |
| |oclc=
| |
| |ref= Meyers
| |
| }}
| |
| * {{публикация|книга |язык= en
| |
| |автор= Posch
| |
| |автор имя= M.
| |
| |автор линк=
| |
| |автор2= Galowicz
| |
| |автор2 имя= J.
| |
| |автор2 линк=
| |
| |заглавие= Expert C++ Programming
| |
| |подзаголовок= Leveraging the power of modern C++ to build scalable modular applications
| |
| |ссылка=
| |
| |архив=
| |
| |архив дата=
| |
| |ответственный=
| |
| |издание= 2nd
| |
| |место=
| |
| |издательство= Packt Publishing
| |
| |год= 2018
| |
| |pages=
| |
| |allpages=
| |
| |isbn= 978-1-78883-139-0
| |
| |oclc=
| |
| |ref= Posch, Galowicz
| |
| }}
| |
|
| |
| [[Категория:Библиотеки C++]]
| |
| [[Категория:Структуры данных]] | | [[Категория:Структуры данных]] |
Последовательными контейнерами в языке программирования C++ считаются несколько предопределённых шаблонных типов данных. Каждый из элементов такого контейнера имеет определённую позицию, которая зависит от времени и места помещения его в контейнер, но не зависит от значения элемента. Как правило, к последовательным контейнерам относятся списки, вектора, очереди двустороннего доступа, массивы (начиная со стандарта C++11) и ряд других. Обычно их реализуют на практике в виде связанного списка или массива.