[sequence.reqmts]

# 23 Containers library [[containers]](./#containers)

## 23.2 Requirements [[container.requirements]](container.requirements#sequence.reqmts)

### 23.2.4 Sequence containers [sequence.reqmts]

[1](#1)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L1312)

A sequence container organizes a finite set of objects, all of the same type, into a strictly
linear arrangement[.](#1.sentence-1)

The library provides the following basic kinds of sequence containers:vector, inplace_vector,forward_list, list, and deque[.](#1.sentence-2)

In addition,array and hive are provided as sequence containers
which provide limited sequence operations,
in array's case because it has a fixed number of elements, and
in hive's case because insertion order is unspecified[.](#1.sentence-3)

The library also provides container adaptors that
make it easy to construct abstract data types,
such as stacks,queues,flat_maps,flat_multimaps,flat_sets, orflat_multisets, out of
the basic sequence container kinds (or out of other program-defined sequence containers)[.](#1.sentence-4)

[2](#2)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L1332)

In this subclause,

- [(2.1)](#2.1)

  X denotes a sequence container class,

- [(2.2)](#2.2)

  a denotes a value of type X containing elements of type T,

- [(2.3)](#2.3)

  u denotes the name of a variable being declared,

- [(2.4)](#2.4)

  A denotes X​::​allocator_type if
the [*qualified-id*](expr.prim.id.qual#nt:qualified-id "7.5.5.3 Qualified names [expr.prim.id.qual]") X​::​allocator_type is valid and denotes a
type ([[temp.deduct]](temp.deduct "13.10.3 Template argument deduction")) andallocator<T> if it doesn't,

- [(2.5)](#2.5)

  i and j denote iterators that meet the *Cpp17InputIterator* requirements
and refer to elements implicitly convertible to value_type,

- [(2.6)](#2.6)

  [i, j) denotes a valid range,

- [(2.7)](#2.7)

  rg denotes a value of a type R that models [*container-compatible-range*](container.intro.reqmts#concept:container-compatible-range "23.2.2.1 Introduction [container.intro.reqmts]")<T>,

- [(2.8)](#2.8)

  il designates an object of type initializer_list<value_type>,

- [(2.9)](#2.9)

  n denotes a value of type X​::​size_type,

- [(2.10)](#2.10)

  p denotes a valid constant iterator to a,

- [(2.11)](#2.11)

  q denotes a valid dereferenceable constant iterator to a,

- [(2.12)](#2.12)

  [q1, q2) denotes a valid range of constant iterators in a,

- [(2.13)](#2.13)

  t denotes an lvalue or a const rvalue of X​::​value_type, and

- [(2.14)](#2.14)

  rv denotes a non-const rvalue of X​::​value_type[.](#2.14.sentence-1)

- [(2.15)](#2.15)

  Args denotes a template parameter pack;

- [(2.16)](#2.16)

  args denotes a function parameter pack with the pattern Args&&[.](#2.16.sentence-1)

[3](#3)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L1375)

The complexities of the expressions are sequence dependent[.](#3.sentence-1)

[4](#4)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L1387)

A type X meets the [*sequence container*](#def:container,sequence "23.2.4 Sequence containers [sequence.reqmts]") requirements
if X meets the container requirements and
the following statements and expressions are well-formed and have
the specified semantics[.](#4.sentence-1)

[ð](#itemdecl:1)

`X u(n, t);
`

[5](#5)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L1398)

*Preconditions*: T is *Cpp17CopyInsertable* into X[.](#5.sentence-1)

[6](#6)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L1402)

*Effects*: Constructs a sequence container with n copies of t[.](#6.sentence-1)

[7](#7)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L1406)

*Postconditions*: distance(u.begin(), u.end()) == n is true[.](#7.sentence-1)

[ð](#itemdecl:2)

`X u(i, j);
`

[8](#8)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L1416)

*Preconditions*: T is *Cpp17EmplaceConstructible* into X from *i[.](#8.sentence-1)

For vector,
if the iterator does not meet
the *Cpp17ForwardIterator* requirements ([[forward.iterators]](forward.iterators "24.3.5.5 Forward iterators")),T is also *Cpp17MoveInsertable* into X[.](#8.sentence-2)

[9](#9)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L1424)

*Effects*: Constructs a sequence container equal to the range [i, j)[.](#9.sentence-1)

Each iterator in the range [i, j) is dereferenced exactly once[.](#9.sentence-2)

[10](#10)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L1429)

*Postconditions*: distance(u.begin(), u.end()) == distance(i, j) is true[.](#10.sentence-1)

[ð](#itemdecl:3)

`X(from_range, rg)
`

[11](#11)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L1439)

*Preconditions*: T is *Cpp17EmplaceConstructible* into X from *ranges​::​begin(rg)[.](#11.sentence-1)

For vector,
if R modelsranges​::​[approximately_sized_range](range.approximately.sized#concept:approximately_sized_range "25.4.3 Approximately sized ranges [range.approximately.sized]") but not ranges​::​[sized_range](range.sized#concept:sized_range "25.4.4 Sized ranges [range.sized]") or modelsranges​::​[input_range](range.refinements#concept:input_range "25.4.6 Other range refinements [range.refinements]") but not ranges​::​[forward_range](range.refinements#concept:forward_range "25.4.6 Other range refinements [range.refinements]"),T is also *Cpp17MoveInsertable* into X[.](#11.sentence-2)

[12](#12)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L1451)

*Effects*: Constructs a sequence container equal to the range rg[.](#12.sentence-1)

Each iterator in the range rg is dereferenced exactly once[.](#12.sentence-2)

[13](#13)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L1456)

*Recommended practice*: If R models ranges​::​[approximately_sized_range](range.approximately.sized#concept:approximately_sized_range "25.4.3 Approximately sized ranges [range.approximately.sized]") andranges​::​distance(rg) <= ranges​::​reserve_hint(rg) is true,
an implementation should not perform more than a single reallocation[.](#13.sentence-1)

[14](#14)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L1462)

*Postconditions*: distance(begin(), end()) == ranges​::​distance(rg) is true[.](#14.sentence-1)

[ð](#itemdecl:4)

`X(il)
`

[15](#15)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L1472)

*Effects*: Equivalent to X(il.begin(), il.end())[.](#15.sentence-1)

[ð](#itemdecl:5)

`a = il
`

[16](#16)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L1482)

*Result*: X&[.](#16.sentence-1)

[17](#17)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L1486)

*Preconditions*: T is *Cpp17CopyInsertable* into X and*Cpp17CopyAssignable*[.](#17.sentence-1)

[18](#18)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L1491)

*Effects*: Assigns the range [il.begin(), il.end()) into a[.](#18.sentence-1)

All existing elements of a are either assigned to or destroyed[.](#18.sentence-2)

[19](#19)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L1496)

*Returns*: *this[.](#19.sentence-1)

[ð](#lib:emplace,containers)

`a.emplace(p, args)
`

[20](#20)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L1507)

*Result*: iterator[.](#20.sentence-1)

[21](#21)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L1511)

*Preconditions*: T is *Cpp17EmplaceConstructible* into X from args[.](#21.sentence-1)

For vector, inplace_vector, and deque,T is also *Cpp17MoveInsertable* into X and*Cpp17MoveAssignable*[.](#21.sentence-2)

[22](#22)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L1518)

*Effects*: Inserts an object of type T constructed with std​::​forward<Args>(args)... before p[.](#22.sentence-1)

[*Note [1](#note-1)*:

args can directly or indirectly refer to a value in a[.](#22.sentence-2)

â *end note*]

[23](#23)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L1527)

*Returns*: An iterator that points to the new element[.](#23.sentence-1)

[ð](#lib:insert,containers)

`a.insert(p, t)
`

[24](#24)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L1538)

*Result*: iterator[.](#24.sentence-1)

[25](#25)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L1542)

*Preconditions*: T is *Cpp17CopyInsertable* into X[.](#25.sentence-1)

For vector, inplace_vector, and deque,T is also *Cpp17CopyAssignable*[.](#25.sentence-2)

[26](#26)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L1548)

*Effects*: Inserts a copy of t before p[.](#26.sentence-1)

[27](#27)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L1552)

*Returns*: An iterator that points to the copy of t inserted into a[.](#27.sentence-1)

[ð](#itemdecl:8)

`a.insert(p, rv)
`

[28](#28)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L1562)

*Result*: iterator[.](#28.sentence-1)

[29](#29)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L1566)

*Preconditions*: T is *Cpp17MoveInsertable* into X[.](#29.sentence-1)

For vector, inplace_vector, and deque,T is also *Cpp17MoveAssignable*[.](#29.sentence-2)

[30](#30)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L1572)

*Effects*: Inserts a copy of rv before p[.](#30.sentence-1)

[31](#31)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L1576)

*Returns*: An iterator that points to the copy of rv inserted into a[.](#31.sentence-1)

[ð](#itemdecl:9)

`a.insert(p, n, t)
`

[32](#32)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L1586)

*Result*: iterator[.](#32.sentence-1)

[33](#33)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L1590)

*Preconditions*: T is *Cpp17CopyInsertable* into X and *Cpp17CopyAssignable*[.](#33.sentence-1)

[34](#34)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L1595)

*Effects*: Inserts n copies of t before p[.](#34.sentence-1)

[35](#35)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L1599)

*Returns*: An iterator
that points to the copy of the first element inserted into a, orp if n == 0[.](#35.sentence-1)

[ð](#itemdecl:10)

`a.insert(p, i, j)
`

[36](#36)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L1611)

*Result*: iterator[.](#36.sentence-1)

[37](#37)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L1615)

*Preconditions*: T is *Cpp17EmplaceConstructible* into X from *i[.](#37.sentence-1)

For vector, inplace_vector, and deque,T is also*Cpp17MoveInsertable* into X,
and T meets the*Cpp17MoveConstructible*,*Cpp17MoveAssignable*, and*Cpp17Swappable* ([[swappable.requirements]](swappable.requirements "16.4.4.3 Swappable requirements")) requirements[.](#37.sentence-2)

Neither i nor j are iterators into a[.](#37.sentence-3)

[38](#38)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L1627)

*Effects*: Inserts copies of elements in [i, j) before p[.](#38.sentence-1)

Each iterator in the range [i, j) shall be dereferenced exactly once[.](#38.sentence-2)

[39](#39)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L1632)

*Returns*: An iterator
that points to the copy of the first element inserted into a, orp if i == j[.](#39.sentence-1)

[ð](#lib:insert_range,containers)

`a.insert_range(p, rg)
`

[40](#40)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L1645)

*Result*: iterator[.](#40.sentence-1)

[41](#41)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L1649)

*Preconditions*: T is *Cpp17EmplaceConstructible* into X from *ranges​::​begin(rg)[.](#41.sentence-1)

For vector, inplace_vector, and deque,T is also*Cpp17MoveInsertable* into X,
and T meets the*Cpp17MoveConstructible*,*Cpp17MoveAssignable*, and*Cpp17Swappable* ([[swappable.requirements]](swappable.requirements "16.4.4.3 Swappable requirements")) requirements[.](#41.sentence-2)

rg and a do not overlap[.](#41.sentence-3)

[42](#42)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L1662)

*Effects*: Inserts copies of elements in rg before p[.](#42.sentence-1)

Each iterator in the range rg is dereferenced exactly once[.](#42.sentence-2)

[43](#43)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L1667)

*Returns*: An iterator
that points to the copy of the first element inserted into a, orp if rg is empty[.](#43.sentence-1)

[ð](#itemdecl:12)

`a.insert(p, il)
`

[44](#44)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L1679)

*Effects*: Equivalent to a.insert(p, il.begin(), il.end())[.](#44.sentence-1)

[ð](#lib:erase,containers)

`a.erase(q)
`

[45](#45)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L1690)

*Result*: iterator[.](#45.sentence-1)

[46](#46)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L1694)

*Preconditions*: For vector, inplace_vector, and deque,T is *Cpp17MoveAssignable*[.](#46.sentence-1)

[47](#47)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L1699)

*Effects*: Erases the element pointed to by q[.](#47.sentence-1)

[48](#48)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L1703)

*Returns*: An iterator that points to the element immediately following q prior to the element being erased[.](#48.sentence-1)

If no such element exists, a.end() is returned[.](#48.sentence-2)

[ð](#itemdecl:14)

`a.erase(q1, q2)
`

[49](#49)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L1715)

*Result*: iterator[.](#49.sentence-1)

[50](#50)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L1719)

*Preconditions*: For vector, inplace_vector, and deque,T is *Cpp17MoveAssignable*[.](#50.sentence-1)

[51](#51)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L1724)

*Effects*: Erases the elements in the range [q1, q2)[.](#51.sentence-1)

[52](#52)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L1728)

*Returns*: An iterator that points to the element pointed to by q2 prior to any elements being erased[.](#52.sentence-1)

If no such element exists, a.end() is returned[.](#52.sentence-2)

[ð](#lib:clear,containers)

`a.clear()
`

[53](#53)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L1741)

*Result*: void

[54](#54)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L1745)

*Effects*: Destroys all elements in a[.](#54.sentence-1)

Invalidates all references, pointers, and iterators
referring to the elements of a and
may invalidate the past-the-end iterator[.](#54.sentence-2)

[55](#55)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L1752)

*Postconditions*: a.empty() is true[.](#55.sentence-1)

[56](#56)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L1756)

*Complexity*: Linear[.](#56.sentence-1)

[ð](#lib:assign,containers)

`a.assign(i, j)
`

[57](#57)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L1767)

*Result*: void

[58](#58)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L1771)

*Preconditions*: T is *Cpp17EmplaceConstructible* into X from *i and assignable from *i[.](#58.sentence-1)

For vector,
if the iterator does not meet
the forward iterator requirements ([[forward.iterators]](forward.iterators "24.3.5.5 Forward iterators")),T is also *Cpp17MoveInsertable* into X[.](#58.sentence-2)

Neither i nor j are iterators into a[.](#58.sentence-3)

[59](#59)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L1781)

*Effects*: Replaces elements in a with a copy of [i, j)[.](#59.sentence-1)

Invalidates all references, pointers and iterators
referring to the elements of a[.](#59.sentence-2)

For vector and deque,
also invalidates the past-the-end iterator[.](#59.sentence-3)

Each iterator in the range [i, j) is dereferenced exactly once[.](#59.sentence-4)

[ð](#lib:assign_range,containers)

`a.assign_range(rg)
`

[60](#60)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L1797)

*Result*: void

[61](#61)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L1801)

*Mandates*: [assignable_from](concept.assignable#concept:assignable_from "18.4.8 Concept assignable_­from [concept.assignable]")<T&, ranges​::​range_reference_t<R>> is modeled[.](#61.sentence-1)

[62](#62)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L1806)

*Preconditions*: T is *Cpp17EmplaceConstructible* into X from *ranges​::​begin(rg)[.](#62.sentence-1)

For vector,
if R modelsranges​::​[approximately_sized_range](range.approximately.sized#concept:approximately_sized_range "25.4.3 Approximately sized ranges [range.approximately.sized]") but not ranges​::​[sized_range](range.sized#concept:sized_range "25.4.4 Sized ranges [range.sized]") or modelsranges​::​[input_range](range.refinements#concept:input_range "25.4.6 Other range refinements [range.refinements]") but not ranges​::​[forward_range](range.refinements#concept:forward_range "25.4.6 Other range refinements [range.refinements]"),T is also *Cpp17MoveInsertable* into X[.](#62.sentence-2)

rg and a do not overlap[.](#62.sentence-3)

[63](#63)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L1819)

*Effects*: Replaces elements in a with a copy of each element in rg[.](#63.sentence-1)

Invalidates all references, pointers, and iterators
referring to the elements of a[.](#63.sentence-2)

For vector and deque,
also invalidates the past-the-end iterator[.](#63.sentence-3)

Each iterator in the range rg is dereferenced exactly once[.](#63.sentence-4)

[64](#64)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L1828)

*Recommended practice*: If R models ranges​::​[approximately_sized_range](range.approximately.sized#concept:approximately_sized_range "25.4.3 Approximately sized ranges [range.approximately.sized]") andranges​::​distance(rg) <= ranges​::​reserve_hint(rg) is true,
an implementation should not perform any reallocation[.](#64.sentence-1)

[ð](#itemdecl:18)

`a.assign(il)
`

[65](#65)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L1840)

*Effects*: Equivalent to a.assign(il.begin(), il.end())[.](#65.sentence-1)

[ð](#itemdecl:19)

`a.assign(n, t)
`

[66](#66)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L1850)

*Result*: void

[67](#67)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L1854)

*Preconditions*: T is *Cpp17CopyInsertable* into X and *Cpp17CopyAssignable*[.](#67.sentence-1)

t is not a reference into a[.](#67.sentence-2)

[68](#68)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L1860)

*Effects*: Replaces elements in a with n copies of t[.](#68.sentence-1)

Invalidates all references, pointers and iterators
referring to the elements of a[.](#68.sentence-2)

For vector and deque,
also invalidates the past-the-end iterator[.](#68.sentence-3)

[69](#69)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L1869)

For every sequence container defined in this Clause and in [[strings]](strings "27 Strings library"):

- [(69.1)](#69.1)

If the constructortemplate<class InputIterator> X(InputIterator first, InputIterator last, const allocator_type& alloc = allocator_type()); is called with a type InputIterator that does not qualify as an input
iterator, then the constructor
shall not participate in overload resolution.

- [(69.2)](#69.2)

If the member functions of the forms:template<class InputIterator>*return-type* *F*(const_iterator p,
 InputIterator first, InputIterator last); // such as inserttemplate<class InputIterator>*return-type* *F*(InputIterator first, InputIterator last); // such as append, assigntemplate<class InputIterator>*return-type* *F*(const_iterator i1, const_iterator i2,
 InputIterator first, InputIterator last); // such as replace are called with a type InputIterator that does not qualify as an input
iterator, then these functions
shall not participate in overload resolution.

- [(69.3)](#69.3)

A deduction guide for a sequence container shall not participate in overload resolution
if it has an InputIterator template parameter and a type that does not
qualify as an input iterator is deduced for that parameter,
or if it has an Allocator template parameter and a type that does not
qualify as an allocator is deduced for that parameter.

[70](#70)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L1906)

The following operations are provided for
some types of sequence containers but not others[.](#70.sentence-1)

Operations other than prepend_range and append_range are implemented so as to take amortized constant time[.](#70.sentence-2)

[ð](#itemdecl:20)

`a.front()
`

[71](#71)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L1917)

*Result*: reference; const_reference for constant a[.](#71.sentence-1)

[72](#72)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L1921)

*Hardened preconditions*: a.empty() is false[.](#72.sentence-1)

[73](#73)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L1925)

*Returns*: *a.begin()

[74](#74)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L1929)

*Remarks*: Required forbasic_string,array,deque,forward_list,inplace_vector,list, andvector[.](#74.sentence-1)

[ð](#itemdecl:21)

`a.back()
`

[75](#75)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L1946)

*Result*: reference; const_reference for constant a[.](#75.sentence-1)

[76](#76)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L1950)

*Hardened preconditions*: a.empty() is false[.](#76.sentence-1)

[77](#77)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L1954)

*Effects*: Equivalent to:auto tmp = a.end();--tmp;return *tmp;

[78](#78)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L1963)

*Remarks*: Required forbasic_string,array,deque,inplace_vector,list, andvector[.](#78.sentence-1)

[ð](#itemdecl:22)

`a.emplace_front(args)
`

[79](#79)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L1979)

*Result*: reference

[80](#80)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L1983)

*Preconditions*: T is *Cpp17EmplaceConstructible* into X from args[.](#80.sentence-1)

[81](#81)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L1987)

*Effects*: Prepends an object of type T constructed with std​::​forward<Args>(args)...[.](#81.sentence-1)

[82](#82)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L1992)

*Returns*: a.front()[.](#82.sentence-1)

[83](#83)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L1996)

*Remarks*: Required fordeque,forward_list, andlist[.](#83.sentence-1)

[ð](#itemdecl:23)

`a.emplace_back(args)
`

[84](#84)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L2009)

*Result*: reference

[85](#85)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L2013)

*Preconditions*: T is *Cpp17EmplaceConstructible* into X from args[.](#85.sentence-1)

For vector,T is also *Cpp17MoveInsertable* into X[.](#85.sentence-2)

[86](#86)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L2019)

*Effects*: Appends an object of type T constructed with std​::​forward<Args>(args)...[.](#86.sentence-1)

[87](#87)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L2024)

*Returns*: a.back()[.](#87.sentence-1)

[88](#88)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L2028)

*Remarks*: Required fordeque,inplace_vector,list, andvector[.](#88.sentence-1)

[ð](#itemdecl:24)

`a.push_front(t)
`

[89](#89)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L2042)

*Result*: void

[90](#90)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L2046)

*Preconditions*: T is *Cpp17CopyInsertable* into X[.](#90.sentence-1)

[91](#91)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L2050)

*Effects*: Prepends a copy of t[.](#91.sentence-1)

[92](#92)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L2054)

*Remarks*: Required fordeque,forward_list, andlist[.](#92.sentence-1)

[ð](#itemdecl:25)

`a.push_front(rv)
`

[93](#93)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L2067)

*Result*: void

[94](#94)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L2071)

*Preconditions*: T is *Cpp17MoveInsertable* into X[.](#94.sentence-1)

[95](#95)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L2075)

*Effects*: Prepends a copy of rv[.](#95.sentence-1)

[96](#96)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L2079)

*Remarks*: Required fordeque,forward_list, andlist[.](#96.sentence-1)

[ð](#itemdecl:26)

`a.prepend_range(rg)
`

[97](#97)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L2092)

*Result*: void

[98](#98)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L2096)

*Preconditions*: T is *Cpp17EmplaceConstructible* into X from *ranges​::​begin(rg)[.](#98.sentence-1)

For deque,T is also *Cpp17MoveInsertable* into X, andT meets the*Cpp17MoveConstructible*,*Cpp17MoveAssignable*, and*Cpp17Swappable* ([[swappable.requirements]](swappable.requirements "16.4.4.3 Swappable requirements")) requirements[.](#98.sentence-2)

[99](#99)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L2107)

*Effects*: Inserts copies of elements in rg before begin()[.](#99.sentence-1)

Each iterator in the range rg is dereferenced exactly once[.](#99.sentence-2)

[*Note [2](#note-2)*:

The order of elements in rg is not reversed[.](#99.sentence-3)

â *end note*]

[100](#100)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L2115)

*Remarks*: Required fordeque,forward_list, andlist[.](#100.sentence-1)

[ð](#itemdecl:27)

`a.push_back(t)
`

[101](#101)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L2128)

*Result*: void

[102](#102)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L2132)

*Preconditions*: T is *Cpp17CopyInsertable* into X[.](#102.sentence-1)

[103](#103)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L2136)

*Effects*: Appends a copy of t[.](#103.sentence-1)

[104](#104)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L2140)

*Remarks*: Required forbasic_string,deque,inplace_vector,list, andvector[.](#104.sentence-1)

[ð](#itemdecl:28)

`a.push_back(rv)
`

[105](#105)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L2155)

*Result*: void

[106](#106)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L2159)

*Preconditions*: T is *Cpp17MoveInsertable* into X[.](#106.sentence-1)

[107](#107)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L2163)

*Effects*: Appends a copy of rv[.](#107.sentence-1)

[108](#108)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L2167)

*Remarks*: Required forbasic_string,deque,inplace_vector,list, andvector[.](#108.sentence-1)

[ð](#itemdecl:29)

`a.append_range(rg)
`

[109](#109)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L2182)

*Result*: void

[110](#110)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L2186)

*Preconditions*: T is *Cpp17EmplaceConstructible* into X from *ranges​::​begin(rg)[.](#110.sentence-1)

For vector,T is also*Cpp17MoveInsertable* into X[.](#110.sentence-2)

[111](#111)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L2194)

*Effects*: Inserts copies of elements in rg before end()[.](#111.sentence-1)

Each iterator in the range rg is dereferenced exactly once[.](#111.sentence-2)

[112](#112)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L2199)

*Remarks*: Required fordeque,inplace_vector,list, andvector[.](#112.sentence-1)

[ð](#itemdecl:30)

`a.pop_front()
`

[113](#113)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L2213)

*Result*: void

[114](#114)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L2217)

*Hardened preconditions*: a.empty() is false[.](#114.sentence-1)

[115](#115)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L2221)

*Effects*: Destroys the first element[.](#115.sentence-1)

[116](#116)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L2225)

*Remarks*: Required fordeque,forward_list, andlist[.](#116.sentence-1)

[ð](#itemdecl:31)

`a.pop_back()
`

[117](#117)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L2238)

*Result*: void

[118](#118)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L2242)

*Hardened preconditions*: a.empty() is false[.](#118.sentence-1)

[119](#119)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L2246)

*Effects*: Destroys the last element[.](#119.sentence-1)

[120](#120)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L2250)

*Remarks*: Required forbasic_string,deque,inplace_vector,list, andvector[.](#120.sentence-1)

[ð](#itemdecl:32)

`a[n]
`

[121](#121)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L2265)

*Result*: reference; const_reference for constant a[.](#121.sentence-1)

[122](#122)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L2269)

*Hardened preconditions*: n < a.size() is true[.](#122.sentence-1)

[123](#123)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L2273)

*Effects*: Equivalent to: return *(a.begin() + n);

[124](#124)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L2277)

*Remarks*: Required forbasic_string,array,deque,inplace_vector, andvector[.](#124.sentence-1)

[ð](#itemdecl:33)

`a.at(n)
`

[125](#125)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L2292)

*Result*: reference; const_reference for constant a[.](#125.sentence-1)

[126](#126)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L2296)

*Returns*: *(a.begin() + n)

[127](#127)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L2300)

*Throws*: out_of_range if n >= a.size()[.](#127.sentence-1)

[128](#128)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L2304)

*Remarks*: Required forbasic_string,array,deque,inplace_vector, andvector[.](#128.sentence-1)
