26 Containers library [containers]

26.2 Container requirements [container.requirements]

26.2.3 Sequence containers [sequence.reqmts]

Контейнер последовательности организует конечный набор объектов одного типа в строго линейную структуру. Библиотека обеспечивает четыре основных видов контейнеров последовательности: vector,forward_­list,list, иdeque. Кроме того, array предоставляется как контейнер последовательности, который обеспечивает ограниченные операции последовательности, поскольку он имеет фиксированное количество элементов. Библиотека также предоставляет адаптеры контейнеров, которые упрощают создание абстрактных типов данных, таких какstacks илиqueues, из основных типов контейнеров последовательностей (или из других типов контейнеров последовательностей, которые может определить пользователь).

Контейнеры последовательностей предлагают программисту различные компромиссы сложности и должны использоваться соответственно. vector илиarray - это тип контейнера последовательности, который следует использовать по умолчанию. list илиforward_­list должен использоваться, когда есть частые вставки и удаления из середины последовательности. deque - это предпочтительная структура данных, когда большинство вставок и удалений происходит в начале или в конце последовательности.

В таблицах87 и88, X обозначает класс контейнера последовательности, a обозначает значение типа ,X содержащего элементы типаT, u обозначает имя переменной объявляется, A означает ,X​::​allocator_­type если qualified-idX​::​allocator_­type является действительным , и обозначает тип ([temp.deduct]) , а allocator<T> не тогда , когда это произойдет, i иj обозначают итераторы удовлетворение требований входного итератора и ссылка на элементы, неявно конвертируемые вvalue_­type, [i, j) обозначает допустимый диапазон, il обозначает объект типаinitializer_­list<value_­type>, n обозначает значение типаX​::​size_­type, p обозначает допустимый итератор константы для a,q обозначает допустимый разыменовываемый итератор константы a,[q1, q2) обозначает допустимый диапазон констант итераторы в a,t обозначает lvalue или const rvalue для X​::​value_­typeиrv обозначает неконстантное rvalue дляX​::​value_­type. Args обозначает пакет параметров шаблона; args обозначает пакет параметров функции с шаблономArgs&&.

Сложность выражений зависит от последовательности.

Таблица87 - Требования к контейнеру последовательности (в дополнение к контейнеру)
ВыражениеТип возвратаУтверждение / примечание
до / после состояния
X(n, t)
X u(n, t);
Requires:  T должен быть CopyInsertable вX. Создает контейнер последовательности с копиями
Postconditions:distance(begin(), end()) == n
n t
X(i, j)
X u(i, j);
Requires:  T должен бытьEmplaceConstructible вX от*i. Ибоvector, если итератор не соответствуетforward iterator requirements,T также должен быть MoveInsertable включенX. Каждый итератор в диапазоне[i, j) должен быть разыменован ровно один раз. Создает контейнер последовательности, равный диапазону
Postconditions:distance(begin(), end()) == distance(i, j)
[i, j)
X(il) ЭквивалентноX(il.begin(), il.end())
a = il X& Requires:  T находится CopyInsertable вX иCopyAssignable. Назначает диапазон[il.begin(), il.end()) вa. Все существующие элементыa либо присваиваются, либо уничтожаются.
Returns:  *this.
a.emplace(p, args) iterator Requires:  T находитсяEmplaceConstructible вX отargs. Дляvector иdeque, T также MoveInsertable вX иMoveAssignable. Effects:  Вставляет объект типа, созданногоT с помощью std​::​forward<​Args​>(​args)... beforep.
a.insert(p,t) iterator Requires:  T должен быть CopyInsertable вX. Дляvector иdeque, T также должно бытьCopyAssignable.
Effects:  Вставляет копиюt ранееp.
a.insert(p,rv) iterator Requires:  T должен быть MoveInsertable вX. Дляvector иdeque, T также должно бытьMoveAssignable.
Effects:  Вставляет копиюrv ранееp.
a.insert(p,n,t) iterator Requires:  T должны быть CopyInsertable вX иCopyAssignable.
Вставляетn копииt ранееp.
a.insert(p,i,j) iterator Requires:  T должен бытьEmplaceConstructible вX от*i. Дляvector иdeque,T должен также быть MoveInsertable вX,MoveConstructible,MoveAssignable, иswappable. Каждый итератор в диапазоне[i, j) должен быть разыменован ровно один раз.
Requires:i иj не являются итераторамиa.
Вставляет копии элементов[i, j) передp
a.insert(p, il) iterator a.insert(p, il.begin(), il.end()).
a.erase(q) iterator Requires:  Дляvector иdeque, T должно бытьMoveAssignable.
Effects:  Удаляет элемент, на который указываетq.
a.erase(q1,q2) iterator Requires:  Дляvector иdeque, T должно бытьMoveAssignable.
Effects:  Стирает элементы в диапазоне[q1, q2).
a.clear() void Уничтожает все элементы вa. Делает недействительными все ссылки, указатели и итераторы, относящиеся к элементам,a и может сделать недействительным итератор, прошедший за конец.
Postconditions:a.empty() возвращаетсяtrue.
Complexity: Линейный.
a.assign(i,j) void Requires:  T должно бытьEmplaceConstructible вX от*i и может быть назначено от*i. Ибоvector, если итератор не соответствуетforward iterator requirements,T также должен быть MoveInsertable включенX.
Каждый итератор в диапазоне[i, j) должен быть разыменован ровно один раз.
Requires:i,j не являются итераторами вa.
Заменяет элементы вa копии[i, j).
Делает недействительными все ссылки, указатели и итераторы, относящиеся к элементамa. Дляvector иdequeтакже делает недействительным итератор, прошедший за конец.
a.assign(il) void a.assign(il.begin(), il.end()).
a.assign(n,t) void Requires:  T должны быть CopyInsertable вX иCopyAssignable.
Requires:t это не ссылка наa.
Заменяет элементыa сn копиямиt.
Делает недействительными все ссылки, указатели и итераторы, относящиеся к элементамa. Дляvector иdequeтакже делает недействительным итератор, прошедший за конец.

Итератор вернулся из a.insert(p, t) точек в копию, t вставленную в a.

Итератор вернулся изa.insert(p, rv) точек в копию,rv вставленную вa.

Итератор вернулся изa.insert(p, n, t) точек в копию первого вставленного элементаa, илиp ifn == 0.

Итератор вернулся изa.insert(p, i, j) точек в копию первого вставленного элементаa, илиp ifi == j.

Итератор вернулся изa.insert(p, il) точек в копию первого вставленного элементаaилиp еслиil он пуст.

Итератор вернулся изa.emplace(p, args) точек в новый элемент, созданный изargs вa.

Итератор вернулся из a.erase(q) точек в элемент, следующий непосредственно за q стираемым элементом. Если такого элемента не существует, a.end() возвращается.

Итератор, возвращаемый a.erase(q1, q2) точкой, указывает элемент, на который указывает q2 до того, как какие-либо элементы будут удалены. Если такого элемента не существует, a.end() возвращается.

Для каждого контейнера последовательности, определенного в этом Пункте и Пункте[strings]:

  • Если конструктор

    template <class InputIterator>
      X(InputIterator first, InputIterator last,
        const allocator_type& alloc = allocator_type());

    вызывается с типомInputIterator , который не квалифицируется как итератор ввода, то конструктор не должен участвовать в разрешении перегрузки.

  • Если функции-члены форм:

    template <class InputIterator>
      return-type F(const_iterator p,
                    InputIterator first, InputIterator last);       // such as insert
    
    template <class InputIterator>
      return-type F(InputIterator first, InputIterator last);       // such as append, assign
    
    template <class InputIterator>
      return-type F(const_iterator i1, const_iterator i2,
                    InputIterator first, InputIterator last);       // such as replace
    

    вызываются с типомInputIterator , который не квалифицируется как итератор ввода, то эти функции не должны участвовать в разрешении перегрузки.

  • Руководство по дедукции для контейнера последовательности не должно участвовать в разрешении перегрузки, если у него естьInputIterator параметр шаблона и для этого параметра выводится тип, который не квалифицируется как итератор ввода, или если у него естьAllocator параметр шаблона и тип, который не соответствует требованиям. как распределитель для этого параметра.

В таблице88 перечислены операции, которые предусмотрены для одних типов контейнеров последовательностей, но не для других. Реализация должна обеспечивать эти операции для всех типов контейнеров, показанных в столбце «контейнер», и должна реализовывать их так, чтобы использовать амортизированное постоянное время.

Таблица88 - Операции контейнера необязательной последовательности
ВыражениеТип возвратаОперационная семантикаКонтейнер
a.front() reference; const_­reference для постоянногоa *a.begin() basic_­string, array, deque, forward_­list, list, vector
a.back() reference; const_­reference для постоянногоa { auto tmp = a.end();
--tmp;
return *tmp; }
basic_­string, array, deque, list, vector
a.emplace_­front(args) reference Добавляет объект типа, созданныйT с помощьюstd​::​forward<​Args​>(​args)....
Requires:  T должен бытьEmplaceConstructible вX отargs.
Returns:a.front().
deque, forward_­list, list
a.emplace_­back(args) reference Добавляет объект типа, созданногоT с помощьюstd​::​forward<​Args​>(​args)....
Requires:  T должен бытьEmplaceConstructible вX отargs. Дляvector,T также должны быть MoveInsertable вX.
Returns:a.back().
deque, list, vector
a.push_­front(t) void Готовит копиюt.
Requires:  T должен быть CopyInsertable вX.
deque, forward_­list, list
a.push_­front(rv) void Готовит копиюrv.
Requires:  T должен быть MoveInsertable вX.
deque, forward_­list, list
a.push_­back(t) void Добавляет копиюt.
Requires:  T должен быть CopyInsertable вX.
basic_­string, deque, list, vector
a.push_­back(rv) void Добавляет копиюrv.
Requires:  T должен быть MoveInsertable вX.
basic_­string, deque, list, vector
a.pop_­front() void Уничтожает первый элемент.
Requires:  a.empty() будетfalse.
deque, forward_­list, list
a.pop_­back() void Уничтожает последний элемент.
Requires:  a.empty() будетfalse.
basic_­string, deque, list, vector
a[n] reference; const_­reference для постоянногоa *(a.begin() + n) basic_­string, array, deque, vector
a.at(n) reference; const_­reference для постоянногоa *(a.begin() + n) basic_­string, array, deque, vector

Функция-член at() обеспечивает доступ к элементам контейнера с проверкой границ. at() кидает out_­of_­range если n >= a.size().