Последовательный контейнер

Материал из Поле цифровой дидактики
Версия от 10:30, 19 октября 2022; Patarakin (обсуждение | вклад) (1 версия импортирована)

Шаблон:Стандартная библиотека C++ Последовательными контейнерами (Шаблон:Lang-en) в языке программирования C++ считаются несколько предопределённых шаблонных типов данных стандартной библиотеки STL, которые обеспечивают упорядоченный способ хранения своих элементов. Каждый из элементов такого контейнера имеет определённую позицию, которая зависит от времени и места помещения его в контейнер, но не зависит от значения элемента. Как правило, к последовательным контейнерам относятся списки, вектора, очереди двустороннего доступа, массивы (начиная со стандарта C++11) и ряд других. Обычно их реализуют на практике в виде связанного списка или массива{{#if: | }}<ref name="{{#if: | | _50c9420b26f9f47a }}" group="{{#if: | }}">Шаблон:Sfn-текст.</ref>{{#if: | }}{{#if: | }}<ref name="{{#if: | | _26c01bdd70cc102e }}" group="{{#if: | }}">Шаблон:Sfn-текст.</ref>{{#if: | }}.

Описание

Все основные стандартные классы-контейнеры библиотеки STL подразделяются на последовательные и ассоциативные контейнеры. Ключевое отличие последовательных контейнеров от ассоциативных заключается в том, что при помещении элемента в последовательный контейнер он остаётся там, где его разместили, а в ассоциативном он перемещается туда, где ему положено находиться в соответствии со внутренним устройством контейнера{{#if: | }}<ref name="{{#if: | | _1cdb7351c6922da8 }}" group="{{#if: | }}">Шаблон:Sfn-текст.</ref>{{#if: | }}.

Традиционно в категорию стандартных последовательных контейнеров входят массивы array, списки (как односвязные forward_list, так и двусвязные list), динамические вектора vector и очереди deque{{#if: | }}<ref name="{{#if: | | _5664a80b49f4780e }}" group="{{#if: | }}">Шаблон:Sfn-текст.</ref>{{#if: | }}<ref>Containers Шаблон:Wayback www.cplusplus.com</ref><ref>Containers in C++ STL Шаблон:Wayback www.geeksforgeeks.org</ref>. Иногда в их состав также включают строки string, а к нестандартным последовательным контейнерам относят списки slist и строковые данные rope{{#if: | }}<ref name="{{#if: | | _1cdb7351c6922daf }}" group="{{#if: | }}">Шаблон:Sfn-текст.</ref>{{#if: | }}.

Требования к элементам

Основная технологическая оснастка библиотеки STL (контейнеры, итераторы, алгоритмы) реализована в виде шаблонных классов. Как следствие, эта инфраструктура может одинаково эффективно обрабатывать как встроенные, так и пользовательские типы данных. Тем не менее, все элементы всех контейнеров библиотеки STL должны подчиняться ряду достаточно общих требований. Во-первых, они должны быть перемещаемыми и копируемыми. Во-вторых, к ним должно быть допустимо применение операции присваивания. В-третьих, для их уничтожения должен быть доступен деструктор. В дополнение к этим требованиям ряд последовательных контейнерных классов требует наличия конструктора по умолчанию, а в некоторых методах может потребоваться определённая операция сравнения на равенство operator==() для элементов{{#if: | }}<ref name="{{#if: | | _85f04b2be2c5e42c }}" group="{{#if: | }}">Шаблон:Sfn-текст.</ref>{{#if: | }}{{#if: | }}<ref name="{{#if: | | _530c2f84bb214059 }}" group="{{#if: | }}">Шаблон:Sfn-текст.</ref>{{#if: | }}.

Базовый функционал

С основными последовательными контейнерами связан набор стандартных операций, поддерживаемых всеми классами библиотеки STL для унифицированного доступа к своим элементам{{#if: | }}<ref name="{{#if: | | _098e561e6467a1d5 }}" group="{{#if: | }}">Шаблон:Sfn-текст.</ref>{{#if: | }}.

Название Функции
+ Объединение элементов
+= Добавление элементов в контейнер
<< Добавление элемента в контейнер
at() Доступ к произвольному элементу
front() и first() Предоставляют ссылку на первый элемент в предположении, что он существует. Использование метода front() предпочтительнее по стандарту STL.
back() и last() Предоставляют ссылку на последний элемент в предположении, что он существует. Использование метода back() предпочтительнее по стандарту STL.
contains() Проверка контейнера на наличие переданного элемента
erase() Удаляет элемент, на который указывает параметр-итератор
IndexOf() Возвращает индекс первого элемента, который соответствует значению переданного параметра.
pop_front() Удаляет из контейнера первый элемент
pop_back() Удаляет из контейнера последний элемент
replace() Заменяет значение элемент контейнера на значение своего параметра
push_front() и prepend() Добавляют элемент в начало контейнера. Использование метода push_front() предпочтительнее по стандарту STL.
push_back() и append() Добавляют элемент в конец контейнера. Использование метода push_back() предпочтительнее по стандарту STL.

В дополнение к ним важной операцией считается функция resize(), которая позволяет динамически варьировать количество элементов в коллекции за линейное время. Её поддерживают все классы, за исключением массива array, который идеологически не предназначен для изменений своего размера в памяти{{#if: | }}<ref name="{{#if: | | _985f6bc0dea1d6d5 }}" group="{{#if: | }}">Шаблон:Sfn-текст.</ref>{{#if: | }}.

Примечания

1 }}
       | {{#switch: {{{1}}}
         | узкие = columns reflist-narrow
         | широкие = columns reflist-wide
         | #default = columns
         }}
       | {{#switch: {{{1}}}
         | 1 = 
         | 2 | 3 = columns
         | #default = columns reflist-narrow
         }}
       }}
     | columns
     }}
   }}" style="{{#if: 
   | column-width:{{{colwidth}}};
   | {{#if: 
     | {{#iferror: {{#ifexpr: {{{1}}} > 1 }}
       | {{#switch: {{{1}}}
         | узкие | широкие = 
         | #default = column-width:{{{1}}};
         }}
       }}
     }}
   }} list-style-type: {{#switch: 
   | upper-alpha
   | upper-roman
   | lower-alpha
   | lower-greek
   | lower-roman = {{{group}}}
   | #default = decimal
   }};">

<references group="" responsive="{{#if:

 | 0
 | {{#if: 
   | {{#iferror: {{#expr: {{{1}}} > 1 }}
     | {{#switch: {{{1}}}
       | узкие | широкие = 1
       | #default = 0
       }}
     | {{#switch: {{{1}}}
       | 1 = 0
       | #default = 1
       }}
     }}
   | 1
   }}
}}"></references>

Ошибка скрипта: Модуля «Check for unknown parameters» не существует.

Источники