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

Материал из Поле цифровой дидактики
м 1 версия импортирована
Содержимое страницы заменено на «'''Последовательными контейнерами''' в языке программирования C++ считаются несколько предопределённых шаблонных типов данных. Каждый из элементов такого контейнера имеет определённую позицию, которая зависит от времен...»
Метка: замена
 
Строка 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++]]
[[Категория:Структуры данных]]
[[Категория:Структуры данных]]

Текущая версия от 11:45, 19 октября 2022

Последовательными контейнерами в языке программирования C++ считаются несколько предопределённых шаблонных типов данных. Каждый из элементов такого контейнера имеет определённую позицию, которая зависит от времени и места помещения его в контейнер, но не зависит от значения элемента. Как правило, к последовательным контейнерам относятся списки, вектора, очереди двустороннего доступа, массивы (начиная со стандарта C++11) и ряд других. Обычно их реализуют на практике в виде связанного списка или массива.