Контейнер последовательности организует конечный набор объектов одного типа в строго линейную структуру. Библиотека обеспечивает четыре основных видов контейнеров последовательности: 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&&.
Сложность выражений зависит от последовательности.
Выражение | Тип возврата | Утверждение / примечание |
до / после состояния | ||
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, n, t) точек в копию первого вставленного элементаa, илиp ifn == 0.
Итератор вернулся изa.insert(p, i, j) точек в копию первого вставленного элементаa, илиp ifi == j.
Итератор вернулся изa.insert(p, il) точек в копию первого вставленного элементаaилиp еслиil он пуст.
Итератор вернулся из 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 перечислены операции, которые предусмотрены для одних типов контейнеров последовательностей, но не для других. Реализация должна обеспечивать эти операции для всех типов контейнеров, показанных в столбце «контейнер», и должна реализовывать их так, чтобы использовать амортизированное постоянное время.
Выражение | Тип возврата | Операционная семантика | Контейнер |
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 |