4750 lines
231 KiB
Markdown
4750 lines
231 KiB
Markdown
[sequences]
|
||
|
||
# 23 Containers library [[containers]](./#containers)
|
||
|
||
## 23.3 Sequence containers [sequences]
|
||
|
||
### [23.3.1](#general) General [[sequences.general]](sequences.general)
|
||
|
||
[1](#general-1)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L6039)
|
||
|
||
The headers[<array>](#header:%3carray%3e "23.3.2 Header <array> synopsis [array.syn]"),[<deque>](#header:%3cdeque%3e "23.3.4 Header <deque> synopsis [deque.syn]"),[<forward_list>](#header:%3cforward_list%3e "23.3.6 Header <forward_list> synopsis [forward.list.syn]"),[<hive>](#header:%3chive%3e "23.3.8 Header <hive> synopsis [hive.syn]"),[<inplace_vector>](#header:%3cinplace_vector%3e "23.3.15 Header <inplace_vector> synopsis [inplace.vector.syn]"),[<list>](#header:%3clist%3e "23.3.10 Header <list> synopsis [list.syn]"), and[<vector>](#header:%3cvector%3e "23.3.12 Header <vector> synopsis [vector.syn]") define class templates that meet the requirements for sequence containers[.](#general-1.sentence-1)
|
||
|
||
[2](#general-2)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L6050)
|
||
|
||
The following exposition-only alias template may appear in deduction guides for sequence containers:template<class InputIterator>using *iter-value-type* = typename iterator_traits<InputIterator>::value_type; // *exposition only*
|
||
|
||
### [23.3.2](#array.syn) Header <array> synopsis [[array.syn]](array.syn)
|
||
|
||
[ð](#header:%3carray%3e)
|
||
|
||
// mostly freestanding#include <compare> // see [[compare.syn]](compare.syn "17.12.1 Header <compare> synopsis")#include <initializer_list> // see [[initializer.list.syn]](initializer.list.syn "17.11.2 Header <initializer_list> synopsis")namespace std {// [[array]](#array "23.3.3 Class template array"), class template arraytemplate<class T, size_t N> struct array; // partially freestandingtemplate<class T, size_t N>constexpr bool operator==(const array<T, N>& x, const array<T, N>& y); template<class T, size_t N>constexpr *synth-three-way-result*<T>operator<=>(const array<T, N>& x, const array<T, N>& y); // [[array.special]](#array.special "23.3.3.4 Specialized algorithms"), specialized algorithmstemplate<class T, size_t N>constexpr void swap(array<T, N>& x, array<T, N>& y) noexcept(noexcept(x.swap(y))); // [[array.creation]](#array.creation "23.3.3.6 Array creation functions"), array creation functionstemplate<class T, size_t N>constexpr array<remove_cv_t<T>, N> to_array(T (&a)[N]); template<class T, size_t N>constexpr array<remove_cv_t<T>, N> to_array(T (&&a)[N]); // [[array.tuple]](#array.tuple "23.3.3.7 Tuple interface"), tuple interfacetemplate<class T> struct tuple_size; template<size_t I, class T> struct tuple_element; template<class T, size_t N>struct tuple_size<array<T, N>>; template<size_t I, class T, size_t N>struct tuple_element<I, array<T, N>>; template<size_t I, class T, size_t N>constexpr T& get(array<T, N>&) noexcept; template<size_t I, class T, size_t N>constexpr T&& get(array<T, N>&&) noexcept; template<size_t I, class T, size_t N>constexpr const T& get(const array<T, N>&) noexcept; template<size_t I, class T, size_t N>constexpr const T&& get(const array<T, N>&&) noexcept;}
|
||
|
||
### [23.3.3](#array) Class template array [[array]](array)
|
||
|
||
#### [23.3.3.1](#array.overview) Overview [[array.overview]](array.overview)
|
||
|
||
[1](#array.overview-1)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L6108)
|
||
|
||
The header [<array>](#header:%3carray%3e "23.3.2 Header <array> synopsis [array.syn]") defines a class template for storing fixed-size
|
||
sequences of objects[.](#array.overview-1.sentence-1)
|
||
|
||
An array is a [contiguous container](container.reqmts#def:container,contiguous "23.2.2.2 Container requirements [container.reqmts]")[.](#array.overview-1.sentence-2)
|
||
|
||
An instance of array<T, N> stores N elements of type T,
|
||
so that size() == N is an invariant[.](#array.overview-1.sentence-3)
|
||
|
||
[2](#array.overview-2)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L6116)
|
||
|
||
An array is an [aggregate](dcl.init.aggr#def:aggregate "9.5.2 Aggregates [dcl.init.aggr]") that can be
|
||
list-initialized with up
|
||
to N elements whose types are convertible to T[.](#array.overview-2.sentence-1)
|
||
|
||
[3](#array.overview-3)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L6123)
|
||
|
||
An array meets all of the requirements
|
||
of a container ([[container.reqmts]](container.reqmts "23.2.2.2 Container requirements")) and
|
||
of a reversible container ([[container.rev.reqmts]](container.rev.reqmts "23.2.2.3 Reversible container requirements")),
|
||
except that a default
|
||
constructed array object is not empty if N>0[.](#array.overview-3.sentence-1)
|
||
|
||
An array meets some of the requirements of a[sequence container](sequence.reqmts "23.2.4 Sequence containers [sequence.reqmts]")[.](#array.overview-3.sentence-2)
|
||
|
||
Descriptions are provided here
|
||
only for operations on array that are not described in
|
||
one of these tables and
|
||
for operations where there is additional semantic information[.](#array.overview-3.sentence-3)
|
||
|
||
[4](#array.overview-4)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L6137)
|
||
|
||
array<T, N> is a structural type ([[temp.param]](temp.param#term.structural.type "13.2 Template parameters")) ifT is a structural type[.](#array.overview-4.sentence-1)
|
||
|
||
Two values a1 and a2 of type array<T, N> are [template-argument-equivalent](temp.type#def:template-argument-equivalent "13.6 Type equivalence [temp.type]") if and only if
|
||
each pair of corresponding elements in a1 and a2 are template-argument-equivalent[.](#array.overview-4.sentence-2)
|
||
|
||
[5](#array.overview-5)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L6145)
|
||
|
||
The types iterator and const_iterator meet
|
||
the [constexpr iterator](iterator.requirements.general#def:iterator,constexpr "24.3.1 General [iterator.requirements.general]") requirements[.](#array.overview-5.sentence-1)
|
||
|
||
[ð](#lib:array_)
|
||
|
||
namespace std {template<class T, size_t N>struct array {// typesusing value_type = T; using pointer = T*; using const_pointer = const T*; using reference = T&; using const_reference = const T&; using size_type = size_t; using difference_type = ptrdiff_t; using iterator = *implementation-defined*; // see [[container.requirements]](container.requirements "23.2 Requirements")using const_iterator = *implementation-defined*; // see [[container.requirements]](container.requirements "23.2 Requirements")using reverse_iterator = std::reverse_iterator<iterator>; using const_reverse_iterator = std::reverse_iterator<const_iterator>; // no explicit construct/copy/destroy for aggregate typeconstexpr void fill(const T& u); constexpr void swap(array&) noexcept(is_nothrow_swappable_v<T>); // iteratorsconstexpr iterator begin() noexcept; constexpr const_iterator begin() const noexcept; constexpr iterator end() noexcept; constexpr const_iterator end() const noexcept; constexpr reverse_iterator rbegin() noexcept; constexpr const_reverse_iterator rbegin() const noexcept; constexpr reverse_iterator rend() noexcept; constexpr const_reverse_iterator rend() const noexcept; constexpr const_iterator cbegin() const noexcept; constexpr const_iterator cend() const noexcept; constexpr const_reverse_iterator crbegin() const noexcept; constexpr const_reverse_iterator crend() const noexcept; // capacityconstexpr bool empty() const noexcept; constexpr size_type size() const noexcept; constexpr size_type max_size() const noexcept; // element accessconstexpr reference operator[](size_type n); constexpr const_reference operator[](size_type n) const; constexpr reference at(size_type n); // freestanding-deletedconstexpr const_reference at(size_type n) const; // freestanding-deletedconstexpr reference front(); constexpr const_reference front() const; constexpr reference back(); constexpr const_reference back() const; constexpr T* data() noexcept; constexpr const T* data() const noexcept; }; template<class T, class... U> array(T, U...) -> array<T, 1 + sizeof...(U)>;}
|
||
|
||
#### [23.3.3.2](#array.cons) Constructors, copy, and assignment [[array.cons]](array.cons)
|
||
|
||
[1](#array.cons-1)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L6218)
|
||
|
||
An array relies on the implicitly-declared special
|
||
member functions ([[class.default.ctor]](class.default.ctor "11.4.5.2 Default constructors"), [[class.dtor]](class.dtor "11.4.7 Destructors"), [[class.copy.ctor]](class.copy.ctor "11.4.5.3 Copy/move constructors")) to
|
||
conform to the container requirements table in [[container.requirements]](container.requirements "23.2 Requirements")[.](#array.cons-1.sentence-1)
|
||
|
||
In addition to the requirements specified in the container requirements table,
|
||
the implicitly-declared move constructor and move assignment operator for array require that T be *Cpp17MoveConstructible* or *Cpp17MoveAssignable*,
|
||
respectively[.](#array.cons-1.sentence-2)
|
||
|
||
[ð](#array.cons-itemdecl:1)
|
||
|
||
`template<class T, class... U>
|
||
array(T, U...) -> array<T, 1 + sizeof...(U)>;
|
||
`
|
||
|
||
[2](#array.cons-2)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L6234)
|
||
|
||
*Mandates*: (is_same_v<T, U> && ...) is true[.](#array.cons-2.sentence-1)
|
||
|
||
#### [23.3.3.3](#array.members) Member functions [[array.members]](array.members)
|
||
|
||
[ð](#lib:array,size_)
|
||
|
||
`constexpr size_type size() const noexcept;
|
||
`
|
||
|
||
[1](#array.members-1)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L6247)
|
||
|
||
*Returns*: N[.](#array.members-1.sentence-1)
|
||
|
||
[ð](#lib:array,data)
|
||
|
||
`constexpr T* data() noexcept;
|
||
constexpr const T* data() const noexcept;
|
||
`
|
||
|
||
[2](#array.members-2)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L6259)
|
||
|
||
*Returns*: A pointer such that [data(), data() + size()) is a valid range[.](#array.members-2.sentence-1)
|
||
|
||
For a
|
||
non-empty array, data() == addressof(front()) is true[.](#array.members-2.sentence-2)
|
||
|
||
[ð](#lib:array,fill)
|
||
|
||
`constexpr void fill(const T& u);
|
||
`
|
||
|
||
[3](#array.members-3)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L6271)
|
||
|
||
*Effects*: As if by fill_n(begin(), N, u)[.](#array.members-3.sentence-1)
|
||
|
||
[ð](#lib:array,swap)
|
||
|
||
`constexpr void swap(array& y) noexcept(is_nothrow_swappable_v<T>);
|
||
`
|
||
|
||
[4](#array.members-4)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L6282)
|
||
|
||
*Effects*: Equivalent to swap_ranges(begin(), end(), y.begin())[.](#array.members-4.sentence-1)
|
||
|
||
[5](#array.members-5)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L6286)
|
||
|
||
[*Note [1](#array.members-note-1)*:
|
||
|
||
Unlike the swap function for other containers, array::swap takes linear time, can exit via an exception, and does not cause iterators to
|
||
become associated with the other container[.](#array.members-5.sentence-1)
|
||
|
||
â *end note*]
|
||
|
||
#### [23.3.3.4](#array.special) Specialized algorithms [[array.special]](array.special)
|
||
|
||
[ð](#lib:array,swap_)
|
||
|
||
`template<class T, size_t N>
|
||
constexpr void swap(array<T, N>& x, array<T, N>& y) noexcept(noexcept(x.swap(y)));
|
||
`
|
||
|
||
[1](#array.special-1)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L6303)
|
||
|
||
*Constraints*: N == 0 or is_swappable_v<T> is true[.](#array.special-1.sentence-1)
|
||
|
||
[2](#array.special-2)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L6307)
|
||
|
||
*Effects*: As if by x.swap(y)[.](#array.special-2.sentence-1)
|
||
|
||
[3](#array.special-3)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L6311)
|
||
|
||
*Complexity*: Linear in N[.](#array.special-3.sentence-1)
|
||
|
||
#### [23.3.3.5](#array.zero) Zero-sized arrays [[array.zero]](array.zero)
|
||
|
||
[1](#array.zero-1)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L6319)
|
||
|
||
array shall provide support for the special case N == 0[.](#array.zero-1.sentence-1)
|
||
|
||
[2](#array.zero-2)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L6322)
|
||
|
||
In the case that N == 0, begin() == end() == unique value[.](#array.zero-2.sentence-1)
|
||
|
||
The return value of data() is unspecified[.](#array.zero-2.sentence-2)
|
||
|
||
[3](#array.zero-3)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L6326)
|
||
|
||
The effect of calling front() or back() for a zero-sized array is
|
||
undefined[.](#array.zero-3.sentence-1)
|
||
|
||
[4](#array.zero-4)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L6330)
|
||
|
||
Member function swap() shall have a
|
||
non-throwing exception specification[.](#array.zero-4.sentence-1)
|
||
|
||
#### [23.3.3.6](#array.creation) Array creation functions [[array.creation]](array.creation)
|
||
|
||
[ð](#lib:to_array)
|
||
|
||
`template<class T, size_t N>
|
||
constexpr array<remove_cv_t<T>, N> to_array(T (&a)[N]);
|
||
`
|
||
|
||
[1](#array.creation-1)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L6344)
|
||
|
||
*Mandates*: is_array_v<T> is false andis_constructible_v<remove_cv_t<T>, T&> is true[.](#array.creation-1.sentence-1)
|
||
|
||
[2](#array.creation-2)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L6349)
|
||
|
||
*Preconditions*: T meets the *Cpp17CopyConstructible* requirements[.](#array.creation-2.sentence-1)
|
||
|
||
[3](#array.creation-3)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L6353)
|
||
|
||
*Returns*: {{ a[0], …, a[N - 1] }}[.](#array.creation-3.sentence-1)
|
||
|
||
[ð](#lib:to_array_)
|
||
|
||
`template<class T, size_t N>
|
||
constexpr array<remove_cv_t<T>, N> to_array(T (&&a)[N]);
|
||
`
|
||
|
||
[4](#array.creation-4)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L6365)
|
||
|
||
*Mandates*: is_array_v<T> is false andis_constructible_v<remove_cv_t<T>, T> is true[.](#array.creation-4.sentence-1)
|
||
|
||
[5](#array.creation-5)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L6370)
|
||
|
||
*Preconditions*: T meets the *Cpp17MoveConstructible* requirements[.](#array.creation-5.sentence-1)
|
||
|
||
[6](#array.creation-6)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L6374)
|
||
|
||
*Returns*: {{ std::move(a[0]), …, std::move(a[N - 1]) }}[.](#array.creation-6.sentence-1)
|
||
|
||
#### [23.3.3.7](#array.tuple) Tuple interface [[array.tuple]](array.tuple)
|
||
|
||
[ð](#lib:array__)
|
||
|
||
`template<class T, size_t N>
|
||
struct tuple_size<array<T, N>> : integral_constant<size_t, N> { };
|
||
`
|
||
|
||
[ð](#lib:tuple_element)
|
||
|
||
`template<size_t I, class T, size_t N>
|
||
struct tuple_element<I, array<T, N>> {
|
||
using type = T;
|
||
};
|
||
`
|
||
|
||
[1](#array.tuple-1)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L6398)
|
||
|
||
*Mandates*: I < N is true[.](#array.tuple-1.sentence-1)
|
||
|
||
[ð](#lib:array,get)
|
||
|
||
`template<size_t I, class T, size_t N>
|
||
constexpr T& get(array<T, N>& a) noexcept;
|
||
template<size_t I, class T, size_t N>
|
||
constexpr T&& get(array<T, N>&& a) noexcept;
|
||
template<size_t I, class T, size_t N>
|
||
constexpr const T& get(const array<T, N>& a) noexcept;
|
||
template<size_t I, class T, size_t N>
|
||
constexpr const T&& get(const array<T, N>&& a) noexcept;
|
||
`
|
||
|
||
[2](#array.tuple-2)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L6416)
|
||
|
||
*Mandates*: I < N is true[.](#array.tuple-2.sentence-1)
|
||
|
||
[3](#array.tuple-3)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L6420)
|
||
|
||
*Returns*: A reference to the Ith element of a,
|
||
where indexing is zero-based[.](#array.tuple-3.sentence-1)
|
||
|
||
### [23.3.4](#deque.syn) Header <deque> synopsis [[deque.syn]](deque.syn)
|
||
|
||
[ð](#header:%3cdeque%3e)
|
||
|
||
#include <compare> // see [[compare.syn]](compare.syn "17.12.1 Header <compare> synopsis")#include <initializer_list> // see [[initializer.list.syn]](initializer.list.syn "17.11.2 Header <initializer_list> synopsis")namespace std {// [[deque]](#deque "23.3.5 Class template deque"), class template dequetemplate<class T, class Allocator = allocator<T>> class deque; template<class T, class Allocator>constexpr bool operator==(const deque<T, Allocator>& x, const deque<T, Allocator>& y); template<class T, class Allocator>constexpr *synth-three-way-result*<T> operator<=>(const deque<T, Allocator>& x, const deque<T, Allocator>& y); template<class T, class Allocator>constexpr void swap(deque<T, Allocator>& x, deque<T, Allocator>& y)noexcept(noexcept(x.swap(y))); // [[deque.erasure]](#deque.erasure "23.3.5.5 Erasure"), erasuretemplate<class T, class Allocator, class U = T>constexpr typename deque<T, Allocator>::size_type
|
||
erase(deque<T, Allocator>& c, const U& value); template<class T, class Allocator, class Predicate>constexpr typename deque<T, Allocator>::size_type
|
||
erase_if(deque<T, Allocator>& c, Predicate pred); namespace pmr {template<class T>using deque = std::deque<T, polymorphic_allocator<T>>; }}
|
||
|
||
### [23.3.5](#deque) Class template deque [[deque]](deque)
|
||
|
||
#### [23.3.5.1](#deque.overview) Overview [[deque.overview]](deque.overview)
|
||
|
||
[1](#deque.overview-1)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L6466)
|
||
|
||
Adeque is a sequence container that supports [random access iterators](random.access.iterators "24.3.5.7 Random access iterators [random.access.iterators]")[.](#deque.overview-1.sentence-1)
|
||
|
||
In addition, it supports constant time insert and erase operations at the beginning or the end;
|
||
insert and erase in the middle take linear time[.](#deque.overview-1.sentence-2)
|
||
|
||
That is, a deque is especially optimized for pushing and popping elements at the beginning and end[.](#deque.overview-1.sentence-3)
|
||
|
||
Storage management is handled automatically[.](#deque.overview-1.sentence-4)
|
||
|
||
[2](#deque.overview-2)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L6476)
|
||
|
||
A deque meets all of the requirements
|
||
of a container ([[container.reqmts]](container.reqmts "23.2.2.2 Container requirements")),
|
||
of a reversible container ([[container.rev.reqmts]](container.rev.reqmts "23.2.2.3 Reversible container requirements")),
|
||
of an allocator-aware container ([[container.alloc.reqmts]](container.alloc.reqmts "23.2.2.5 Allocator-aware containers")), and
|
||
of a sequence container,
|
||
including the optional sequence container requirements ([[sequence.reqmts]](sequence.reqmts "23.2.4 Sequence containers"))[.](#deque.overview-2.sentence-1)
|
||
|
||
Descriptions are provided here only for operations ondeque that are not described in one of these tables
|
||
or for operations where there is additional semantic information[.](#deque.overview-2.sentence-2)
|
||
|
||
[3](#deque.overview-3)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L6488)
|
||
|
||
The types iterator and const_iterator meet
|
||
the constexpr iterator requirements ([[iterator.requirements.general]](iterator.requirements.general "24.3.1 General"))[.](#deque.overview-3.sentence-1)
|
||
|
||
namespace std {template<class T, class Allocator = allocator<T>>class deque {public:// typesusing value_type = T; using allocator_type = Allocator; using pointer = typename allocator_traits<Allocator>::pointer; using const_pointer = typename allocator_traits<Allocator>::const_pointer; using reference = value_type&; using const_reference = const value_type&; using size_type = *implementation-defined*; // see [[container.requirements]](container.requirements "23.2 Requirements")using difference_type = *implementation-defined*; // see [[container.requirements]](container.requirements "23.2 Requirements")using iterator = *implementation-defined*; // see [[container.requirements]](container.requirements "23.2 Requirements")using const_iterator = *implementation-defined*; // see [[container.requirements]](container.requirements "23.2 Requirements")using reverse_iterator = std::reverse_iterator<iterator>; using const_reverse_iterator = std::reverse_iterator<const_iterator>; // [[deque.cons]](#deque.cons "23.3.5.2 Constructors, copy, and assignment"), construct/copy/destroyconstexpr deque() : deque(Allocator()) { }constexpr explicit deque(const Allocator&); constexpr explicit deque(size_type n, const Allocator& = Allocator()); constexpr deque(size_type n, const T& value, const Allocator& = Allocator()); template<class InputIterator>constexpr deque(InputIterator first, InputIterator last, const Allocator& = Allocator()); template<[*container-compatible-range*](container.intro.reqmts#concept:container-compatible-range "23.2.2.1 Introduction [container.intro.reqmts]")<T> R>constexpr deque(from_range_t, R&& rg, const Allocator& = Allocator()); constexpr deque(const deque& x); constexpr deque(deque&&); constexpr deque(const deque&, const type_identity_t<Allocator>&); constexpr deque(deque&&, const type_identity_t<Allocator>&); constexpr deque(initializer_list<T>, const Allocator& = Allocator()); constexpr ~deque(); constexpr deque& operator=(const deque& x); constexpr deque& operator=(deque&& x)noexcept(allocator_traits<Allocator>::is_always_equal::value); constexpr deque& operator=(initializer_list<T>); template<class InputIterator>constexpr void assign(InputIterator first, InputIterator last); template<[*container-compatible-range*](container.intro.reqmts#concept:container-compatible-range "23.2.2.1 Introduction [container.intro.reqmts]")<T> R>constexpr void assign_range(R&& rg); constexpr void assign(size_type n, const T& t); constexpr void assign(initializer_list<T>); constexpr allocator_type get_allocator() const noexcept; // iteratorsconstexpr iterator begin() noexcept; constexpr const_iterator begin() const noexcept; constexpr iterator end() noexcept; constexpr const_iterator end() const noexcept; constexpr reverse_iterator rbegin() noexcept; constexpr const_reverse_iterator rbegin() const noexcept; constexpr reverse_iterator rend() noexcept; constexpr const_reverse_iterator rend() const noexcept; constexpr const_iterator cbegin() const noexcept; constexpr const_iterator cend() const noexcept; constexpr const_reverse_iterator crbegin() const noexcept; constexpr const_reverse_iterator crend() const noexcept; // [[deque.capacity]](#deque.capacity "23.3.5.3 Capacity"), capacityconstexpr bool empty() const noexcept; constexpr size_type size() const noexcept; constexpr size_type max_size() const noexcept; constexpr void resize(size_type sz); constexpr void resize(size_type sz, const T& c); constexpr void shrink_to_fit(); // element accessconstexpr reference operator[](size_type n); constexpr const_reference operator[](size_type n) const; constexpr reference at(size_type n); constexpr const_reference at(size_type n) const; constexpr reference front(); constexpr const_reference front() const; constexpr reference back(); constexpr const_reference back() const; // [[deque.modifiers]](#deque.modifiers "23.3.5.4 Modifiers"), modifierstemplate<class... Args> constexpr reference emplace_front(Args&&... args); template<class... Args> constexpr reference emplace_back(Args&&... args); template<class... Args> constexpr iterator emplace(const_iterator position, Args&&... args); constexpr void push_front(const T& x); constexpr void push_front(T&& x); template<[*container-compatible-range*](container.intro.reqmts#concept:container-compatible-range "23.2.2.1 Introduction [container.intro.reqmts]")<T> R>constexpr void prepend_range(R&& rg); constexpr void push_back(const T& x); constexpr void push_back(T&& x); template<[*container-compatible-range*](container.intro.reqmts#concept:container-compatible-range "23.2.2.1 Introduction [container.intro.reqmts]")<T> R>constexpr void append_range(R&& rg); constexpr iterator insert(const_iterator position, const T& x); constexpr iterator insert(const_iterator position, T&& x); constexpr iterator insert(const_iterator position, size_type n, const T& x); template<class InputIterator>constexpr iterator insert(const_iterator position,
|
||
InputIterator first, InputIterator last); template<[*container-compatible-range*](container.intro.reqmts#concept:container-compatible-range "23.2.2.1 Introduction [container.intro.reqmts]")<T> R>constexpr iterator insert_range(const_iterator position, R&& rg); constexpr iterator insert(const_iterator position, initializer_list<T>); constexpr void pop_front(); constexpr void pop_back(); constexpr iterator erase(const_iterator position); constexpr iterator erase(const_iterator first, const_iterator last); constexpr void swap(deque&)noexcept(allocator_traits<Allocator>::is_always_equal::value); constexpr void clear() noexcept; }; template<class InputIterator, class Allocator = allocator<*iter-value-type*<InputIterator>>> deque(InputIterator, InputIterator, Allocator = Allocator())-> deque<*iter-value-type*<InputIterator>, Allocator>; template<ranges::[input_range](range.refinements#concept:input_range "25.4.6 Other range refinements [range.refinements]") R, class Allocator = allocator<ranges::range_value_t<R>>> deque(from_range_t, R&&, Allocator = Allocator())-> deque<ranges::range_value_t<R>, Allocator>;}
|
||
|
||
#### [23.3.5.2](#deque.cons) Constructors, copy, and assignment [[deque.cons]](deque.cons)
|
||
|
||
[ð](#lib:deque,constructor)
|
||
|
||
`constexpr explicit deque(const Allocator&);
|
||
`
|
||
|
||
[1](#deque.cons-1)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L6624)
|
||
|
||
*Effects*: Constructs an emptydeque,
|
||
using the specified allocator[.](#deque.cons-1.sentence-1)
|
||
|
||
[2](#deque.cons-2)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L6630)
|
||
|
||
*Complexity*: Constant[.](#deque.cons-2.sentence-1)
|
||
|
||
[ð](#lib:deque,constructor_)
|
||
|
||
`constexpr explicit deque(size_type n, const Allocator& = Allocator());
|
||
`
|
||
|
||
[3](#deque.cons-3)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L6641)
|
||
|
||
*Preconditions*: T is *Cpp17DefaultInsertable* into deque[.](#deque.cons-3.sentence-1)
|
||
|
||
[4](#deque.cons-4)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L6645)
|
||
|
||
*Effects*: Constructs a deque withn default-inserted elements using the specified allocator[.](#deque.cons-4.sentence-1)
|
||
|
||
[5](#deque.cons-5)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L6650)
|
||
|
||
*Complexity*: Linear in n[.](#deque.cons-5.sentence-1)
|
||
|
||
[ð](#lib:deque,constructor__)
|
||
|
||
`constexpr deque(size_type n, const T& value, const Allocator& = Allocator());
|
||
`
|
||
|
||
[6](#deque.cons-6)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L6661)
|
||
|
||
*Preconditions*: T is *Cpp17CopyInsertable* into deque[.](#deque.cons-6.sentence-1)
|
||
|
||
[7](#deque.cons-7)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L6665)
|
||
|
||
*Effects*: Constructs adeque with n copies of value,
|
||
using the specified allocator[.](#deque.cons-7.sentence-1)
|
||
|
||
[8](#deque.cons-8)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L6672)
|
||
|
||
*Complexity*: Linear in n[.](#deque.cons-8.sentence-1)
|
||
|
||
[ð](#lib:deque,constructor___)
|
||
|
||
`template<class InputIterator>
|
||
constexpr deque(InputIterator first, InputIterator last, const Allocator& = Allocator());
|
||
`
|
||
|
||
[9](#deque.cons-9)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L6684)
|
||
|
||
*Effects*: Constructs adeque equal to the range
|
||
[first, last),
|
||
using the specified allocator[.](#deque.cons-9.sentence-1)
|
||
|
||
[10](#deque.cons-10)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L6692)
|
||
|
||
*Complexity*: Linear in distance(first, last)[.](#deque.cons-10.sentence-1)
|
||
|
||
[ð](#lib:deque,constructor____)
|
||
|
||
`template<[container-compatible-range](container.intro.reqmts#concept:container-compatible-range "23.2.2.1 Introduction [container.intro.reqmts]")<T> R>
|
||
constexpr deque(from_range_t, R&& rg, const Allocator& = Allocator());
|
||
`
|
||
|
||
[11](#deque.cons-11)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L6704)
|
||
|
||
*Effects*: Constructs a deque with the elements of the range rg,
|
||
using the specified allocator[.](#deque.cons-11.sentence-1)
|
||
|
||
[12](#deque.cons-12)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L6709)
|
||
|
||
*Complexity*: Linear in ranges::distance(rg)[.](#deque.cons-12.sentence-1)
|
||
|
||
#### [23.3.5.3](#deque.capacity) Capacity [[deque.capacity]](deque.capacity)
|
||
|
||
[ð](#lib:resize,deque)
|
||
|
||
`constexpr void resize(size_type sz);
|
||
`
|
||
|
||
[1](#deque.capacity-1)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L6722)
|
||
|
||
*Preconditions*: T is *Cpp17MoveInsertable* and *Cpp17DefaultInsertable* into deque[.](#deque.capacity-1.sentence-1)
|
||
|
||
[2](#deque.capacity-2)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L6726)
|
||
|
||
*Effects*: If sz < size(), erases the last size() - sz elements
|
||
from the sequence[.](#deque.capacity-2.sentence-1)
|
||
|
||
Otherwise,
|
||
appends sz - size() default-inserted elements to the sequence[.](#deque.capacity-2.sentence-2)
|
||
|
||
[ð](#lib:resize,deque_)
|
||
|
||
`constexpr void resize(size_type sz, const T& c);
|
||
`
|
||
|
||
[3](#deque.capacity-3)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L6739)
|
||
|
||
*Preconditions*: T is *Cpp17CopyInsertable* into deque[.](#deque.capacity-3.sentence-1)
|
||
|
||
[4](#deque.capacity-4)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L6743)
|
||
|
||
*Effects*: If sz < size(), erases the last size() - sz elements
|
||
from the sequence[.](#deque.capacity-4.sentence-1)
|
||
|
||
Otherwise,
|
||
appends sz - size() copies of c to the sequence[.](#deque.capacity-4.sentence-2)
|
||
|
||
[ð](#lib:shrink_to_fit,deque)
|
||
|
||
`constexpr void shrink_to_fit();
|
||
`
|
||
|
||
[5](#deque.capacity-5)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L6756)
|
||
|
||
*Preconditions*: T is *Cpp17MoveInsertable* into deque[.](#deque.capacity-5.sentence-1)
|
||
|
||
[6](#deque.capacity-6)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L6760)
|
||
|
||
*Effects*: shrink_to_fit is a non-binding request to reduce memory use
|
||
but does not change the size of the sequence[.](#deque.capacity-6.sentence-1)
|
||
|
||
[*Note [1](#deque.capacity-note-1)*:
|
||
|
||
The request is non-binding to allow latitude for
|
||
implementation-specific optimizations[.](#deque.capacity-6.sentence-2)
|
||
|
||
â *end note*]
|
||
|
||
If the size is equal to the old capacity, or
|
||
if an exception is thrown other than by the move constructor
|
||
of a non-*Cpp17CopyInsertable* T,
|
||
then there are no effects[.](#deque.capacity-6.sentence-3)
|
||
|
||
[7](#deque.capacity-7)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L6773)
|
||
|
||
*Complexity*: If the size is not equal to the old capacity,
|
||
linear in the size of the sequence;
|
||
otherwise constant[.](#deque.capacity-7.sentence-1)
|
||
|
||
[8](#deque.capacity-8)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L6779)
|
||
|
||
*Remarks*: If the size is not equal to the old capacity,
|
||
then invalidates all the references, pointers, and iterators
|
||
referring to the elements in the sequence,
|
||
as well as the past-the-end iterator[.](#deque.capacity-8.sentence-1)
|
||
|
||
#### [23.3.5.4](#deque.modifiers) Modifiers [[deque.modifiers]](deque.modifiers)
|
||
|
||
[ð](#lib:insert,deque)
|
||
|
||
`constexpr iterator insert(const_iterator position, const T& x);
|
||
constexpr iterator insert(const_iterator position, T&& x);
|
||
constexpr iterator insert(const_iterator position, size_type n, const T& x);
|
||
template<class InputIterator>
|
||
constexpr iterator insert(const_iterator position,
|
||
InputIterator first, InputIterator last);
|
||
template<[container-compatible-range](container.intro.reqmts#concept:container-compatible-range "23.2.2.1 Introduction [container.intro.reqmts]")<T> R>
|
||
constexpr iterator insert_range(const_iterator position, R&& rg);
|
||
constexpr iterator insert(const_iterator position, initializer_list<T>);
|
||
|
||
template<class... Args> constexpr reference emplace_front(Args&&... args);
|
||
template<class... Args> constexpr reference emplace_back(Args&&... args);
|
||
template<class... Args> constexpr iterator emplace(const_iterator position, Args&&... args);
|
||
constexpr void push_front(const T& x);
|
||
constexpr void push_front(T&& x);
|
||
template<[container-compatible-range](container.intro.reqmts#concept:container-compatible-range "23.2.2.1 Introduction [container.intro.reqmts]")<T> R>
|
||
constexpr void prepend_range(R&& rg);
|
||
constexpr void push_back(const T& x);
|
||
constexpr void push_back(T&& x);
|
||
template<[container-compatible-range](container.intro.reqmts#concept:container-compatible-range "23.2.2.1 Introduction [container.intro.reqmts]")<T> R>
|
||
constexpr void append_range(R&& rg);
|
||
`
|
||
|
||
[1](#deque.modifiers-1)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L6818)
|
||
|
||
*Effects*: An insertion in the middle of the deque invalidates all the iterators and
|
||
references to elements of the deque[.](#deque.modifiers-1.sentence-1)
|
||
|
||
An insertion at either end of the
|
||
deque invalidates all the iterators to the deque, but has no effect on
|
||
the validity of references to elements of the deque[.](#deque.modifiers-1.sentence-2)
|
||
|
||
[2](#deque.modifiers-2)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L6826)
|
||
|
||
*Complexity*: The complexity is linear in the number of elements inserted plus the lesser
|
||
of the distances to the beginning and end of the deque[.](#deque.modifiers-2.sentence-1)
|
||
|
||
Inserting a single element at either the beginning or end of a deque always takes constant time
|
||
and causes a single call to a constructor ofT[.](#deque.modifiers-2.sentence-2)
|
||
|
||
[3](#deque.modifiers-3)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L6834)
|
||
|
||
*Remarks*: If an exception is thrown other than by the
|
||
copy constructor, move constructor,
|
||
assignment operator, or move assignment operator ofT,
|
||
there are no effects[.](#deque.modifiers-3.sentence-1)
|
||
|
||
If an exception is thrown while inserting a single element at either end,
|
||
there are no effects[.](#deque.modifiers-3.sentence-2)
|
||
|
||
Otherwise, if an exception is thrown by the move constructor of a
|
||
non-*Cpp17CopyInsertable*T, the effects are unspecified[.](#deque.modifiers-3.sentence-3)
|
||
|
||
[ð](#lib:erase,deque)
|
||
|
||
`constexpr iterator erase(const_iterator position);
|
||
constexpr iterator erase(const_iterator first, const_iterator last);
|
||
constexpr void pop_front();
|
||
constexpr void pop_back();
|
||
`
|
||
|
||
[4](#deque.modifiers-4)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L6857)
|
||
|
||
*Effects*: An erase operation that erases the last element of a deque invalidates only the past-the-end iterator
|
||
and all iterators and references to the erased elements[.](#deque.modifiers-4.sentence-1)
|
||
|
||
An erase operation that erases the first
|
||
element of a deque but not the last element invalidates only iterators
|
||
and references to the erased elements[.](#deque.modifiers-4.sentence-2)
|
||
|
||
An erase operation
|
||
that erases neither the first element nor the last element of a deque invalidates the past-the-end
|
||
iterator and all iterators and references to all the elements of the deque[.](#deque.modifiers-4.sentence-3)
|
||
|
||
[*Note [1](#deque.modifiers-note-1)*:
|
||
|
||
pop_front and pop_back are erase operations[.](#deque.modifiers-4.sentence-4)
|
||
|
||
â *end note*]
|
||
|
||
[5](#deque.modifiers-5)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L6869)
|
||
|
||
*Throws*: Nothing unless an exception is thrown by the assignment operator ofT[.](#deque.modifiers-5.sentence-1)
|
||
|
||
[6](#deque.modifiers-6)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L6874)
|
||
|
||
*Complexity*: The number of calls to the destructor of T is the same as the
|
||
number of elements erased, but the number of calls to the assignment operator of T is
|
||
no more than the lesser of the number of elements before the erased elements and the number of elements after the erased elements[.](#deque.modifiers-6.sentence-1)
|
||
|
||
#### [23.3.5.5](#deque.erasure) Erasure [[deque.erasure]](deque.erasure)
|
||
|
||
[ð](#lib:erase,deque_)
|
||
|
||
`template<class T, class Allocator, class U = T>
|
||
constexpr typename deque<T, Allocator>::size_type
|
||
erase(deque<T, Allocator>& c, const U& value);
|
||
`
|
||
|
||
[1](#deque.erasure-1)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L6891)
|
||
|
||
*Effects*: Equivalent to:auto it = remove(c.begin(), c.end(), value);auto r = distance(it, c.end());
|
||
c.erase(it, c.end());return r;
|
||
|
||
[ð](#lib:erase_if,deque)
|
||
|
||
`template<class T, class Allocator, class Predicate>
|
||
constexpr typename deque<T, Allocator>::size_type
|
||
erase_if(deque<T, Allocator>& c, Predicate pred);
|
||
`
|
||
|
||
[2](#deque.erasure-2)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L6910)
|
||
|
||
*Effects*: Equivalent to:auto it = remove_if(c.begin(), c.end(), pred);auto r = distance(it, c.end());
|
||
c.erase(it, c.end());return r;
|
||
|
||
### [23.3.6](#forward.list.syn) Header <forward_list> synopsis [[forward.list.syn]](forward.list.syn)
|
||
|
||
[ð](#header:%3cforward_list%3e)
|
||
|
||
#include <compare> // see [[compare.syn]](compare.syn "17.12.1 Header <compare> synopsis")#include <initializer_list> // see [[initializer.list.syn]](initializer.list.syn "17.11.2 Header <initializer_list> synopsis")namespace std {// [[forward.list]](#forward.list "23.3.7 Class template forward_list"), class template forward_listtemplate<class T, class Allocator = allocator<T>> class forward_list; template<class T, class Allocator>constexpr bool operator==(const forward_list<T, Allocator>& x, const forward_list<T, Allocator>& y); template<class T, class Allocator>constexpr *synth-three-way-result*<T> operator<=>(const forward_list<T, Allocator>& x, const forward_list<T, Allocator>& y); template<class T, class Allocator>constexpr void swap(forward_list<T, Allocator>& x, forward_list<T, Allocator>& y)noexcept(noexcept(x.swap(y))); // [[forward.list.erasure]](#forward.list.erasure "23.3.7.7 Erasure"), erasuretemplate<class T, class Allocator, class U = T>constexpr typename forward_list<T, Allocator>::size_type
|
||
erase(forward_list<T, Allocator>& c, const U& value); template<class T, class Allocator, class Predicate>constexpr typename forward_list<T, Allocator>::size_type
|
||
erase_if(forward_list<T, Allocator>& c, Predicate pred); namespace pmr {template<class T>using forward_list = std::forward_list<T, polymorphic_allocator<T>>; }}
|
||
|
||
### [23.3.7](#forward.list) Class template forward_list [[forward.list]](forward.list)
|
||
|
||
#### [23.3.7.1](#forward.list.overview) Overview [[forward.list.overview]](forward.list.overview)
|
||
|
||
[1](#forward.list.overview-1)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L6962)
|
||
|
||
A forward_list is a container that supports forward iterators and allows
|
||
constant time insert and erase operations anywhere within the sequence, with storage
|
||
management handled automatically[.](#forward.list.overview-1.sentence-1)
|
||
|
||
Fast random access to list elements is not supported[.](#forward.list.overview-1.sentence-2)
|
||
|
||
[*Note [1](#forward.list.overview-note-1)*:
|
||
|
||
It is intended that forward_list have zero space or time overhead
|
||
relative to a hand-written C-style singly linked list[.](#forward.list.overview-1.sentence-3)
|
||
|
||
Features that would conflict with
|
||
that goal have been omitted[.](#forward.list.overview-1.sentence-4)
|
||
|
||
â *end note*]
|
||
|
||
[2](#forward.list.overview-2)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L6972)
|
||
|
||
A forward_list meets all of the requirements
|
||
of a container ([[container.reqmts]](container.reqmts "23.2.2.2 Container requirements")),
|
||
except that the size() member function is not provided andoperator== has linear complexity[.](#forward.list.overview-2.sentence-1)
|
||
|
||
A forward_list also meets all of the requirements
|
||
for an allocator-aware container ([[container.alloc.reqmts]](container.alloc.reqmts "23.2.2.5 Allocator-aware containers"))[.](#forward.list.overview-2.sentence-2)
|
||
|
||
In addition, a forward_list provides the assign member functions and
|
||
several of the optional sequence container requirements ([[sequence.reqmts]](sequence.reqmts "23.2.4 Sequence containers"))[.](#forward.list.overview-2.sentence-3)
|
||
|
||
Descriptions are provided here only for operations onforward_list that are not described in that table or for operations where there
|
||
is additional semantic information[.](#forward.list.overview-2.sentence-4)
|
||
|
||
[3](#forward.list.overview-3)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L6986)
|
||
|
||
[*Note [2](#forward.list.overview-note-2)*:
|
||
|
||
Modifying any list requires access to the element preceding the first element
|
||
of interest, but in a forward_list there is no constant-time way to access a
|
||
preceding element[.](#forward.list.overview-3.sentence-1)
|
||
|
||
For this reason, erase_after and splice_after take fully-open ranges, not semi-open ranges[.](#forward.list.overview-3.sentence-2)
|
||
|
||
â *end note*]
|
||
|
||
[4](#forward.list.overview-4)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L6995)
|
||
|
||
The types iterator and const_iterator meet
|
||
the constexpr iterator requirements ([[iterator.requirements.general]](iterator.requirements.general "24.3.1 General"))[.](#forward.list.overview-4.sentence-1)
|
||
|
||
namespace std {template<class T, class Allocator = allocator<T>>class forward_list {public:// typesusing value_type = T; using allocator_type = Allocator; using pointer = typename allocator_traits<Allocator>::pointer; using const_pointer = typename allocator_traits<Allocator>::const_pointer; using reference = value_type&; using const_reference = const value_type&; using size_type = *implementation-defined*; // see [[container.requirements]](container.requirements "23.2 Requirements")using difference_type = *implementation-defined*; // see [[container.requirements]](container.requirements "23.2 Requirements")using iterator = *implementation-defined*; // see [[container.requirements]](container.requirements "23.2 Requirements")using const_iterator = *implementation-defined*; // see [[container.requirements]](container.requirements "23.2 Requirements")// [[forward.list.cons]](#forward.list.cons "23.3.7.2 Constructors, copy, and assignment"), construct/copy/destroyconstexpr forward_list() : forward_list(Allocator()) { }constexpr explicit forward_list(const Allocator&); constexpr explicit forward_list(size_type n, const Allocator& = Allocator()); constexpr forward_list(size_type n, const T& value, const Allocator& = Allocator()); template<class InputIterator>constexpr forward_list(InputIterator first, InputIterator last, const Allocator& = Allocator()); template<[*container-compatible-range*](container.intro.reqmts#concept:container-compatible-range "23.2.2.1 Introduction [container.intro.reqmts]")<T> R>constexpr forward_list(from_range_t, R&& rg, const Allocator& = Allocator()); constexpr forward_list(const forward_list& x); constexpr forward_list(forward_list&& x); constexpr forward_list(const forward_list& x, const type_identity_t<Allocator>&); constexpr forward_list(forward_list&& x, const type_identity_t<Allocator>&); constexpr forward_list(initializer_list<T>, const Allocator& = Allocator()); constexpr ~forward_list(); constexpr forward_list& operator=(const forward_list& x); constexpr forward_list& operator=(forward_list&& x)noexcept(allocator_traits<Allocator>::is_always_equal::value); constexpr forward_list& operator=(initializer_list<T>); template<class InputIterator>constexpr void assign(InputIterator first, InputIterator last); template<[*container-compatible-range*](container.intro.reqmts#concept:container-compatible-range "23.2.2.1 Introduction [container.intro.reqmts]")<T> R>constexpr void assign_range(R&& rg); constexpr void assign(size_type n, const T& t); constexpr void assign(initializer_list<T>); constexpr allocator_type get_allocator() const noexcept; // [[forward.list.iter]](#forward.list.iter "23.3.7.3 Iterators"), iteratorsconstexpr iterator before_begin() noexcept; constexpr const_iterator before_begin() const noexcept; constexpr iterator begin() noexcept; constexpr const_iterator begin() const noexcept; constexpr iterator end() noexcept; constexpr const_iterator end() const noexcept; constexpr const_iterator cbegin() const noexcept; constexpr const_iterator cbefore_begin() const noexcept; constexpr const_iterator cend() const noexcept; // capacityconstexpr bool empty() const noexcept; constexpr size_type max_size() const noexcept; // [[forward.list.access]](#forward.list.access "23.3.7.4 Element access"), element accessconstexpr reference front(); constexpr const_reference front() const; // [[forward.list.modifiers]](#forward.list.modifiers "23.3.7.5 Modifiers"), modifierstemplate<class... Args> constexpr reference emplace_front(Args&&... args); constexpr void push_front(const T& x); constexpr void push_front(T&& x); template<[*container-compatible-range*](container.intro.reqmts#concept:container-compatible-range "23.2.2.1 Introduction [container.intro.reqmts]")<T> R>constexpr void prepend_range(R&& rg); constexpr void pop_front(); template<class... Args>constexpr iterator emplace_after(const_iterator position, Args&&... args); constexpr iterator insert_after(const_iterator position, const T& x); constexpr iterator insert_after(const_iterator position, T&& x); constexpr iterator insert_after(const_iterator position, size_type n, const T& x); template<class InputIterator>constexpr iterator insert_after(const_iterator position,
|
||
InputIterator first, InputIterator last); constexpr iterator insert_after(const_iterator position, initializer_list<T> il); template<[*container-compatible-range*](container.intro.reqmts#concept:container-compatible-range "23.2.2.1 Introduction [container.intro.reqmts]")<T> R>constexpr iterator insert_range_after(const_iterator position, R&& rg); constexpr iterator erase_after(const_iterator position); constexpr iterator erase_after(const_iterator position, const_iterator last); constexpr void swap(forward_list&)noexcept(allocator_traits<Allocator>::is_always_equal::value); constexpr void resize(size_type sz); constexpr void resize(size_type sz, const value_type& c); constexpr void clear() noexcept; // [[forward.list.ops]](#forward.list.ops "23.3.7.6 Operations"), forward_list operationsconstexpr void splice_after(const_iterator position, forward_list& x); constexpr void splice_after(const_iterator position, forward_list&& x); constexpr void splice_after(const_iterator position, forward_list& x, const_iterator i); constexpr void splice_after(const_iterator position, forward_list&& x, const_iterator i); constexpr void splice_after(const_iterator position, forward_list& x,
|
||
const_iterator first, const_iterator last); constexpr void splice_after(const_iterator position, forward_list&& x,
|
||
const_iterator first, const_iterator last); constexpr size_type remove(const T& value); template<class Predicate> constexpr size_type remove_if(Predicate pred);
|
||
|
||
size_type unique(); template<class BinaryPredicate> constexpr size_type unique(BinaryPredicate binary_pred); constexpr void merge(forward_list& x); constexpr void merge(forward_list&& x); template<class Compare> constexpr void merge(forward_list& x, Compare comp); template<class Compare> constexpr void merge(forward_list&& x, Compare comp); constexpr void sort(); template<class Compare> constexpr void sort(Compare comp); constexpr void reverse() noexcept; }; template<class InputIterator, class Allocator = allocator<*iter-value-type*<InputIterator>>> forward_list(InputIterator, InputIterator, Allocator = Allocator())-> forward_list<*iter-value-type*<InputIterator>, Allocator>; template<ranges::[input_range](range.refinements#concept:input_range "25.4.6 Other range refinements [range.refinements]") R, class Allocator = allocator<ranges::range_value_t<R>>> forward_list(from_range_t, R&&, Allocator = Allocator())-> forward_list<ranges::range_value_t<R>, Allocator>;}
|
||
|
||
[5](#forward.list.overview-5)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L7131)
|
||
|
||
An incomplete type T may be used when instantiating forward_list if the allocator meets the[allocator completeness requirements](allocator.requirements.completeness "16.4.4.6.2 Allocator completeness requirements [allocator.requirements.completeness]")[.](#forward.list.overview-5.sentence-1)
|
||
|
||
T shall be complete before any member of the resulting specialization
|
||
of forward_list is referenced[.](#forward.list.overview-5.sentence-2)
|
||
|
||
#### [23.3.7.2](#forward.list.cons) Constructors, copy, and assignment [[forward.list.cons]](forward.list.cons)
|
||
|
||
[ð](#lib:forward_list,constructor)
|
||
|
||
`constexpr explicit forward_list(const Allocator&);
|
||
`
|
||
|
||
[1](#forward.list.cons-1)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L7146)
|
||
|
||
*Effects*: Constructs an empty forward_list object using the specified allocator[.](#forward.list.cons-1.sentence-1)
|
||
|
||
[2](#forward.list.cons-2)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L7150)
|
||
|
||
*Complexity*: Constant[.](#forward.list.cons-2.sentence-1)
|
||
|
||
[ð](#lib:forward_list,constructor_)
|
||
|
||
`constexpr explicit forward_list(size_type n, const Allocator& = Allocator());
|
||
`
|
||
|
||
[3](#forward.list.cons-3)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L7161)
|
||
|
||
*Preconditions*: T is *Cpp17DefaultInsertable* into forward_list[.](#forward.list.cons-3.sentence-1)
|
||
|
||
[4](#forward.list.cons-4)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L7165)
|
||
|
||
*Effects*: Constructs a forward_list object with n default-inserted elements using the specified allocator[.](#forward.list.cons-4.sentence-1)
|
||
|
||
[5](#forward.list.cons-5)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L7170)
|
||
|
||
*Complexity*: Linear in n[.](#forward.list.cons-5.sentence-1)
|
||
|
||
[ð](#lib:forward_list,constructor__)
|
||
|
||
`constexpr forward_list(size_type n, const T& value, const Allocator& = Allocator());
|
||
`
|
||
|
||
[6](#forward.list.cons-6)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L7181)
|
||
|
||
*Preconditions*: T is *Cpp17CopyInsertable* into forward_list[.](#forward.list.cons-6.sentence-1)
|
||
|
||
[7](#forward.list.cons-7)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L7185)
|
||
|
||
*Effects*: Constructs a forward_list object with n copies of value using the specified allocator[.](#forward.list.cons-7.sentence-1)
|
||
|
||
[8](#forward.list.cons-8)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L7189)
|
||
|
||
*Complexity*: Linear in n[.](#forward.list.cons-8.sentence-1)
|
||
|
||
[ð](#lib:forward_list,constructor___)
|
||
|
||
`template<class InputIterator>
|
||
constexpr forward_list(InputIterator first, InputIterator last, const Allocator& = Allocator());
|
||
`
|
||
|
||
[9](#forward.list.cons-9)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L7201)
|
||
|
||
*Effects*: Constructs a forward_list object equal to the range [first, last)[.](#forward.list.cons-9.sentence-1)
|
||
|
||
[10](#forward.list.cons-10)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L7205)
|
||
|
||
*Complexity*: Linear in distance(first, last)[.](#forward.list.cons-10.sentence-1)
|
||
|
||
[ð](#lib:forward_list,constructor____)
|
||
|
||
`template<[container-compatible-range](container.intro.reqmts#concept:container-compatible-range "23.2.2.1 Introduction [container.intro.reqmts]")<T> R>
|
||
constexpr forward_list(from_range_t, R&& rg, const Allocator& = Allocator());
|
||
`
|
||
|
||
[11](#forward.list.cons-11)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L7217)
|
||
|
||
*Effects*: Constructs a forward_list object
|
||
with the elements of the range rg[.](#forward.list.cons-11.sentence-1)
|
||
|
||
[12](#forward.list.cons-12)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L7222)
|
||
|
||
*Complexity*: Linear in ranges::distance(rg)[.](#forward.list.cons-12.sentence-1)
|
||
|
||
#### [23.3.7.3](#forward.list.iter) Iterators [[forward.list.iter]](forward.list.iter)
|
||
|
||
[ð](#lib:before_begin,forward_list)
|
||
|
||
`constexpr iterator before_begin() noexcept;
|
||
constexpr const_iterator before_begin() const noexcept;
|
||
constexpr const_iterator cbefore_begin() const noexcept;
|
||
`
|
||
|
||
[1](#forward.list.iter-1)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L7238)
|
||
|
||
*Effects*: cbefore_begin() is equivalent toconst_cast<forward_list const&>(*this).before_begin()[.](#forward.list.iter-1.sentence-1)
|
||
|
||
[2](#forward.list.iter-2)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L7243)
|
||
|
||
*Returns*: A non-dereferenceable iterator that, when incremented, is equal to the iterator
|
||
returned by begin()[.](#forward.list.iter-2.sentence-1)
|
||
|
||
[3](#forward.list.iter-3)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L7248)
|
||
|
||
*Remarks*: before_begin() == end() shall equal false[.](#forward.list.iter-3.sentence-1)
|
||
|
||
#### [23.3.7.4](#forward.list.access) Element access [[forward.list.access]](forward.list.access)
|
||
|
||
[ð](#lib:front,forward_list)
|
||
|
||
`constexpr reference front();
|
||
constexpr const_reference front() const;
|
||
`
|
||
|
||
[1](#forward.list.access-1)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L7262)
|
||
|
||
*Returns*: *begin()
|
||
|
||
#### [23.3.7.5](#forward.list.modifiers) Modifiers [[forward.list.modifiers]](forward.list.modifiers)
|
||
|
||
[1](#forward.list.modifiers-1)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L7269)
|
||
|
||
The member functions in this subclause
|
||
do not affect the validity of iterators and references
|
||
when inserting elements, and when erasing elements
|
||
invalidate iterators and references to the erased elements only[.](#forward.list.modifiers-1.sentence-1)
|
||
|
||
If an exception is thrown by any of these member functions
|
||
there is no effect on the container[.](#forward.list.modifiers-1.sentence-2)
|
||
|
||
Inserting n elements into a forward_list is linear inn, and the number of calls to the copy or move constructor of T is
|
||
exactly equal to n[.](#forward.list.modifiers-1.sentence-3)
|
||
|
||
Erasing n elements from a forward_list is
|
||
linear in n and the number of calls to the destructor of type T is
|
||
exactly equal to n[.](#forward.list.modifiers-1.sentence-4)
|
||
|
||
[ð](#lib:emplace_front,forward_list)
|
||
|
||
`template<class... Args> constexpr reference emplace_front(Args&&... args);
|
||
`
|
||
|
||
[2](#forward.list.modifiers-2)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L7288)
|
||
|
||
*Effects*: Inserts an object of type value_type constructed withvalue_type(std::forward<Args>(args)...) at the beginning of the list[.](#forward.list.modifiers-2.sentence-1)
|
||
|
||
[ð](#lib:push_front,forward_list)
|
||
|
||
`constexpr void push_front(const T& x);
|
||
constexpr void push_front(T&& x);
|
||
`
|
||
|
||
[3](#forward.list.modifiers-3)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L7301)
|
||
|
||
*Effects*: Inserts a copy of x at the beginning of the list[.](#forward.list.modifiers-3.sentence-1)
|
||
|
||
[ð](#lib:prepend_range,forward_list)
|
||
|
||
`template<[container-compatible-range](container.intro.reqmts#concept:container-compatible-range "23.2.2.1 Introduction [container.intro.reqmts]")<T> R>
|
||
constexpr void prepend_range(R&& rg);
|
||
`
|
||
|
||
[4](#forward.list.modifiers-4)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L7313)
|
||
|
||
*Effects*: Inserts a copy of each element of rg at the beginning of the list[.](#forward.list.modifiers-4.sentence-1)
|
||
|
||
[*Note [1](#forward.list.modifiers-note-1)*:
|
||
|
||
The order of elements is not reversed[.](#forward.list.modifiers-4.sentence-2)
|
||
|
||
â *end note*]
|
||
|
||
[ð](#lib:pop,forward_list)
|
||
|
||
`constexpr void pop_front();
|
||
`
|
||
|
||
[5](#forward.list.modifiers-5)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L7327)
|
||
|
||
*Effects*: As if by erase_after(before_begin())[.](#forward.list.modifiers-5.sentence-1)
|
||
|
||
[ð](#lib:insert_after,forward_list)
|
||
|
||
`constexpr iterator insert_after(const_iterator position, const T& x);
|
||
`
|
||
|
||
[6](#forward.list.modifiers-6)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L7338)
|
||
|
||
*Preconditions*: T is *Cpp17CopyInsertable* into forward_list[.](#forward.list.modifiers-6.sentence-1)
|
||
|
||
position is before_begin() or is a dereferenceable
|
||
iterator in the range [begin(), end())[.](#forward.list.modifiers-6.sentence-2)
|
||
|
||
[7](#forward.list.modifiers-7)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L7344)
|
||
|
||
*Effects*: Inserts a copy of x after position[.](#forward.list.modifiers-7.sentence-1)
|
||
|
||
[8](#forward.list.modifiers-8)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L7348)
|
||
|
||
*Returns*: An iterator pointing to the copy of x[.](#forward.list.modifiers-8.sentence-1)
|
||
|
||
[ð](#lib:insert_after,forward_list_)
|
||
|
||
`constexpr iterator insert_after(const_iterator position, T&& x);
|
||
`
|
||
|
||
[9](#forward.list.modifiers-9)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L7359)
|
||
|
||
*Preconditions*: T is *Cpp17MoveInsertable* into forward_list[.](#forward.list.modifiers-9.sentence-1)
|
||
|
||
position is before_begin() or is a dereferenceable
|
||
iterator in the range [begin(), end())[.](#forward.list.modifiers-9.sentence-2)
|
||
|
||
[10](#forward.list.modifiers-10)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L7365)
|
||
|
||
*Effects*: Inserts a copy of x after position[.](#forward.list.modifiers-10.sentence-1)
|
||
|
||
[11](#forward.list.modifiers-11)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L7369)
|
||
|
||
*Returns*: An iterator pointing to the copy of x[.](#forward.list.modifiers-11.sentence-1)
|
||
|
||
[ð](#lib:insert_after,forward_list__)
|
||
|
||
`constexpr iterator insert_after(const_iterator position, size_type n, const T& x);
|
||
`
|
||
|
||
[12](#forward.list.modifiers-12)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L7380)
|
||
|
||
*Preconditions*: T is *Cpp17CopyInsertable* into forward_list[.](#forward.list.modifiers-12.sentence-1)
|
||
|
||
position is before_begin() or is a dereferenceable
|
||
iterator in the range [begin(), end())[.](#forward.list.modifiers-12.sentence-2)
|
||
|
||
[13](#forward.list.modifiers-13)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L7386)
|
||
|
||
*Effects*: Inserts n copies of x after position[.](#forward.list.modifiers-13.sentence-1)
|
||
|
||
[14](#forward.list.modifiers-14)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L7390)
|
||
|
||
*Returns*: An iterator pointing to the last inserted copy of x, orposition if n == 0 is true[.](#forward.list.modifiers-14.sentence-1)
|
||
|
||
[ð](#lib:insert_after,forward_list___)
|
||
|
||
`template<class InputIterator>
|
||
constexpr iterator insert_after(const_iterator position,
|
||
InputIterator first, InputIterator last);
|
||
`
|
||
|
||
[15](#forward.list.modifiers-15)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L7404)
|
||
|
||
*Preconditions*: T is *Cpp17EmplaceConstructible* into forward_list from *first[.](#forward.list.modifiers-15.sentence-1)
|
||
|
||
position is before_begin() or is a dereferenceable
|
||
iterator in the range [begin(), end())[.](#forward.list.modifiers-15.sentence-2)
|
||
|
||
Neither first nor last are iterators in *this[.](#forward.list.modifiers-15.sentence-3)
|
||
|
||
[16](#forward.list.modifiers-16)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L7412)
|
||
|
||
*Effects*: Inserts copies of elements in [first, last) after position[.](#forward.list.modifiers-16.sentence-1)
|
||
|
||
[17](#forward.list.modifiers-17)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L7416)
|
||
|
||
*Returns*: An iterator pointing to the last inserted element, orposition if first == last is true[.](#forward.list.modifiers-17.sentence-1)
|
||
|
||
[ð](#lib:insert_range_after,forward_list)
|
||
|
||
`template<[container-compatible-range](container.intro.reqmts#concept:container-compatible-range "23.2.2.1 Introduction [container.intro.reqmts]")<T> R>
|
||
constexpr iterator insert_range_after(const_iterator position, R&& rg);
|
||
`
|
||
|
||
[18](#forward.list.modifiers-18)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L7429)
|
||
|
||
*Preconditions*: T is *Cpp17EmplaceConstructible* into forward_list from *ranges::begin(rg)[.](#forward.list.modifiers-18.sentence-1)
|
||
|
||
position is before_begin() or
|
||
is a dereferenceable iterator in the range [begin(), end())[.](#forward.list.modifiers-18.sentence-2)
|
||
|
||
rg and *this do not overlap[.](#forward.list.modifiers-18.sentence-3)
|
||
|
||
[19](#forward.list.modifiers-19)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L7437)
|
||
|
||
*Effects*: Inserts copies of elements in the range rg after position[.](#forward.list.modifiers-19.sentence-1)
|
||
|
||
[20](#forward.list.modifiers-20)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L7441)
|
||
|
||
*Returns*: An iterator pointing to the last inserted element,
|
||
or position if rg is empty[.](#forward.list.modifiers-20.sentence-1)
|
||
|
||
[ð](#lib:insert_after,forward_list____)
|
||
|
||
`constexpr iterator insert_after(const_iterator position, initializer_list<T> il);
|
||
`
|
||
|
||
[21](#forward.list.modifiers-21)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L7453)
|
||
|
||
*Effects*: Equivalent to: return insert_after(position, il.begin(), il.end());
|
||
|
||
[ð](#lib:emplace_after,forward_list)
|
||
|
||
`template<class... Args>
|
||
constexpr iterator emplace_after(const_iterator position, Args&&... args);
|
||
`
|
||
|
||
[22](#forward.list.modifiers-22)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L7466)
|
||
|
||
*Preconditions*: T is *Cpp17EmplaceConstructible* into forward_list from std::forward<Args>(args)...[.](#forward.list.modifiers-22.sentence-1)
|
||
|
||
position is before_begin() or is a dereferenceable
|
||
iterator in the range [begin(), end())[.](#forward.list.modifiers-22.sentence-2)
|
||
|
||
[23](#forward.list.modifiers-23)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L7473)
|
||
|
||
*Effects*: Inserts an object of type value_type direct-non-list-initialized withstd::forward<Args>(args)... after position[.](#forward.list.modifiers-23.sentence-1)
|
||
|
||
[24](#forward.list.modifiers-24)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L7478)
|
||
|
||
*Returns*: An iterator pointing to the new object[.](#forward.list.modifiers-24.sentence-1)
|
||
|
||
[ð](#lib:erase_after,forward_list)
|
||
|
||
`constexpr iterator erase_after(const_iterator position);
|
||
`
|
||
|
||
[25](#forward.list.modifiers-25)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L7489)
|
||
|
||
*Preconditions*: The iterator following position is dereferenceable[.](#forward.list.modifiers-25.sentence-1)
|
||
|
||
[26](#forward.list.modifiers-26)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L7493)
|
||
|
||
*Effects*: Erases the element pointed to by the iterator following position[.](#forward.list.modifiers-26.sentence-1)
|
||
|
||
[27](#forward.list.modifiers-27)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L7497)
|
||
|
||
*Returns*: An iterator pointing to the element following the one that was
|
||
erased, or end() if no such element exists[.](#forward.list.modifiers-27.sentence-1)
|
||
|
||
[28](#forward.list.modifiers-28)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L7502)
|
||
|
||
*Throws*: Nothing[.](#forward.list.modifiers-28.sentence-1)
|
||
|
||
[ð](#forward.list.modifiers-itemdecl:13)
|
||
|
||
`constexpr iterator erase_after(const_iterator position, const_iterator last);
|
||
`
|
||
|
||
[29](#forward.list.modifiers-29)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L7512)
|
||
|
||
*Preconditions*: All iterators in the range (position, last) are dereferenceable[.](#forward.list.modifiers-29.sentence-1)
|
||
|
||
[30](#forward.list.modifiers-30)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L7516)
|
||
|
||
*Effects*: Erases the elements in the range (position, last)[.](#forward.list.modifiers-30.sentence-1)
|
||
|
||
[31](#forward.list.modifiers-31)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L7520)
|
||
|
||
*Returns*: last[.](#forward.list.modifiers-31.sentence-1)
|
||
|
||
[32](#forward.list.modifiers-32)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L7524)
|
||
|
||
*Throws*: Nothing[.](#forward.list.modifiers-32.sentence-1)
|
||
|
||
[ð](#lib:resize,forward_list)
|
||
|
||
`constexpr void resize(size_type sz);
|
||
`
|
||
|
||
[33](#forward.list.modifiers-33)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L7535)
|
||
|
||
*Preconditions*: T is *Cpp17DefaultInsertable* into forward_list[.](#forward.list.modifiers-33.sentence-1)
|
||
|
||
[34](#forward.list.modifiers-34)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L7539)
|
||
|
||
*Effects*: If sz < distance(begin(), end()), erases the last distance(begin(),
|
||
end()) - sz elements from the list[.](#forward.list.modifiers-34.sentence-1)
|
||
|
||
Otherwise, inserts sz - distance(begin(), end()) default-inserted
|
||
elements at the end of the list[.](#forward.list.modifiers-34.sentence-2)
|
||
|
||
[ð](#forward.list.modifiers-itemdecl:15)
|
||
|
||
`constexpr void resize(size_type sz, const value_type& c);
|
||
`
|
||
|
||
[35](#forward.list.modifiers-35)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L7551)
|
||
|
||
*Preconditions*: T is *Cpp17CopyInsertable* into forward_list[.](#forward.list.modifiers-35.sentence-1)
|
||
|
||
[36](#forward.list.modifiers-36)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L7555)
|
||
|
||
*Effects*: If sz < distance(begin(), end()), erases the last distance(begin(),
|
||
end()) - sz elements from the list[.](#forward.list.modifiers-36.sentence-1)
|
||
|
||
Otherwise, inserts sz - distance(begin(), end()) copies of c at the end of the list[.](#forward.list.modifiers-36.sentence-2)
|
||
|
||
[ð](#lib:clear,forward_list)
|
||
|
||
`constexpr void clear() noexcept;
|
||
`
|
||
|
||
[37](#forward.list.modifiers-37)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L7569)
|
||
|
||
*Effects*: Erases all elements in the range [begin(), end())[.](#forward.list.modifiers-37.sentence-1)
|
||
|
||
[38](#forward.list.modifiers-38)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L7573)
|
||
|
||
*Remarks*: Does not invalidate past-the-end iterators[.](#forward.list.modifiers-38.sentence-1)
|
||
|
||
#### [23.3.7.6](#forward.list.ops) Operations [[forward.list.ops]](forward.list.ops)
|
||
|
||
[1](#forward.list.ops-1)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L7580)
|
||
|
||
In this subclause,
|
||
arguments for a template parameter
|
||
named Predicate or BinaryPredicate shall meet the corresponding requirements in [[algorithms.requirements]](algorithms.requirements "26.2 Algorithms requirements")[.](#forward.list.ops-1.sentence-1)
|
||
|
||
The semantics of i + n,
|
||
where i is an iterator into the list and n is an integer,
|
||
are the same as those of next(i, n)[.](#forward.list.ops-1.sentence-2)
|
||
|
||
The expression i - n,
|
||
where i is an iterator into the list and n is an integer,
|
||
means an iterator j such that j + n == i is true[.](#forward.list.ops-1.sentence-3)
|
||
|
||
For merge and sort,
|
||
the definitions and requirements in [[alg.sorting]](alg.sorting "26.8 Sorting and related operations") apply[.](#forward.list.ops-1.sentence-4)
|
||
|
||
[ð](#lib:splice_after,forward_list)
|
||
|
||
`constexpr void splice_after(const_iterator position, forward_list& x);
|
||
constexpr void splice_after(const_iterator position, forward_list&& x);
|
||
`
|
||
|
||
[2](#forward.list.ops-2)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L7601)
|
||
|
||
*Preconditions*: position is before_begin() or is a dereferenceable
|
||
iterator in the range [begin(), end())[.](#forward.list.ops-2.sentence-1)
|
||
|
||
get_allocator() == x.get_allocator() is true[.](#forward.list.ops-2.sentence-2)
|
||
|
||
addressof(x) != this is true[.](#forward.list.ops-2.sentence-3)
|
||
|
||
[3](#forward.list.ops-3)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L7608)
|
||
|
||
*Effects*: Inserts the contents of x afterposition, and x becomes empty[.](#forward.list.ops-3.sentence-1)
|
||
|
||
Pointers and references to the moved
|
||
elements of x now refer to those same elements but as members of *this[.](#forward.list.ops-3.sentence-2)
|
||
|
||
Iterators referring to the moved elements will continue to refer to their elements, but
|
||
they now behave as iterators into *this, not into x[.](#forward.list.ops-3.sentence-3)
|
||
|
||
[4](#forward.list.ops-4)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L7616)
|
||
|
||
*Throws*: Nothing[.](#forward.list.ops-4.sentence-1)
|
||
|
||
[5](#forward.list.ops-5)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L7620)
|
||
|
||
*Complexity*: O(distance(x.begin(), x.end()))
|
||
|
||
[ð](#lib:splice_after,forward_list_)
|
||
|
||
`constexpr void splice_after(const_iterator position, forward_list& x, const_iterator i);
|
||
constexpr void splice_after(const_iterator position, forward_list&& x, const_iterator i);
|
||
`
|
||
|
||
[6](#forward.list.ops-6)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L7632)
|
||
|
||
*Preconditions*: position is before_begin() or is a dereferenceable
|
||
iterator in the range [begin(), end())[.](#forward.list.ops-6.sentence-1)
|
||
|
||
The iterator following i is a dereferenceable iterator in x[.](#forward.list.ops-6.sentence-2)
|
||
|
||
get_allocator() == x.get_allocator() is true[.](#forward.list.ops-6.sentence-3)
|
||
|
||
[7](#forward.list.ops-7)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L7639)
|
||
|
||
*Effects*: Inserts the element following i into *this, followingposition, and removes it from x[.](#forward.list.ops-7.sentence-1)
|
||
|
||
The result is unchanged if position == i or position == ++i[.](#forward.list.ops-7.sentence-2)
|
||
|
||
Pointers
|
||
and references to *++i continue to refer to the same element but as a member of*this[.](#forward.list.ops-7.sentence-3)
|
||
|
||
Iterators to *++i continue to refer to
|
||
the same element, but now behave as iterators into *this, not into x[.](#forward.list.ops-7.sentence-4)
|
||
|
||
[8](#forward.list.ops-8)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L7648)
|
||
|
||
*Throws*: Nothing[.](#forward.list.ops-8.sentence-1)
|
||
|
||
[9](#forward.list.ops-9)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L7652)
|
||
|
||
*Complexity*: O(1)
|
||
|
||
[ð](#lib:splice_after,forward_list__)
|
||
|
||
`constexpr void splice_after(const_iterator position, forward_list& x,
|
||
const_iterator first, const_iterator last);
|
||
constexpr void splice_after(const_iterator position, forward_list&& x,
|
||
const_iterator first, const_iterator last);
|
||
`
|
||
|
||
[10](#forward.list.ops-10)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L7666)
|
||
|
||
*Preconditions*: position is before_begin() or is a
|
||
dereferenceable iterator in the range [begin(), end())[.](#forward.list.ops-10.sentence-1)
|
||
|
||
(first, last) is a
|
||
valid range in x, and all iterators in the range (first, last) are
|
||
dereferenceable[.](#forward.list.ops-10.sentence-2)
|
||
|
||
position is not an iterator in the range (first, last)[.](#forward.list.ops-10.sentence-3)
|
||
|
||
get_allocator() == x.get_allocator() is true[.](#forward.list.ops-10.sentence-4)
|
||
|
||
[11](#forward.list.ops-11)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L7674)
|
||
|
||
*Effects*: Inserts elements in the range (first, last) after position and
|
||
removes the elements from x[.](#forward.list.ops-11.sentence-1)
|
||
|
||
Pointers and references to the moved elements ofx now refer to those same elements but as members of *this[.](#forward.list.ops-11.sentence-2)
|
||
|
||
Iterators
|
||
referring to the moved elements will continue to refer to their elements, but they now
|
||
behave as iterators into *this, not into x[.](#forward.list.ops-11.sentence-3)
|
||
|
||
[12](#forward.list.ops-12)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L7682)
|
||
|
||
*Complexity*: O(distance(first, last))
|
||
|
||
[ð](#lib:remove,forward_list)
|
||
|
||
`constexpr size_type remove(const T& value);
|
||
template<class Predicate> constexpr size_type remove_if(Predicate pred);
|
||
`
|
||
|
||
[13](#forward.list.ops-13)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L7695)
|
||
|
||
*Effects*: Erases all the elements in the list referred to by a list iterator i for
|
||
which the following conditions hold: *i == value (for remove()),pred(*i) is true (for remove_if())[.](#forward.list.ops-13.sentence-1)
|
||
|
||
Invalidates only the iterators and references to the erased elements[.](#forward.list.ops-13.sentence-2)
|
||
|
||
[14](#forward.list.ops-14)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L7702)
|
||
|
||
*Returns*: The number of elements erased[.](#forward.list.ops-14.sentence-1)
|
||
|
||
[15](#forward.list.ops-15)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L7706)
|
||
|
||
*Throws*: Nothing unless an exception is thrown by the equality comparison or the
|
||
predicate[.](#forward.list.ops-15.sentence-1)
|
||
|
||
[16](#forward.list.ops-16)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L7711)
|
||
|
||
*Complexity*: Exactly distance(begin(), end()) applications of the corresponding
|
||
predicate[.](#forward.list.ops-16.sentence-1)
|
||
|
||
[17](#forward.list.ops-17)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L7716)
|
||
|
||
*Remarks*: [Stable](algorithm.stable "16.4.6.8 Requirements for stable algorithms [algorithm.stable]")[.](#forward.list.ops-17.sentence-1)
|
||
|
||
[ð](#lib:unique,forward_list)
|
||
|
||
`constexpr size_type unique();
|
||
template<class BinaryPredicate> constexpr size_type unique(BinaryPredicate binary_pred);
|
||
`
|
||
|
||
[18](#forward.list.ops-18)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L7728)
|
||
|
||
Let binary_pred be equal_to<>{} for the first overload[.](#forward.list.ops-18.sentence-1)
|
||
|
||
[19](#forward.list.ops-19)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L7731)
|
||
|
||
*Preconditions*: binary_pred is an equivalence relation[.](#forward.list.ops-19.sentence-1)
|
||
|
||
[20](#forward.list.ops-20)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L7735)
|
||
|
||
*Effects*: Erases all but the first element from every consecutive
|
||
group of equivalent elements[.](#forward.list.ops-20.sentence-1)
|
||
|
||
That is, for a nonempty list, erases all elements referred to
|
||
by the iterator i in the range [begin() + 1, end())
|
||
for which binary_pred(*i, *(i - 1)) is true[.](#forward.list.ops-20.sentence-2)
|
||
|
||
Invalidates only the iterators and references to the erased elements[.](#forward.list.ops-20.sentence-3)
|
||
|
||
[21](#forward.list.ops-21)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L7744)
|
||
|
||
*Returns*: The number of elements erased[.](#forward.list.ops-21.sentence-1)
|
||
|
||
[22](#forward.list.ops-22)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L7748)
|
||
|
||
*Throws*: Nothing unless an exception is thrown by the predicate[.](#forward.list.ops-22.sentence-1)
|
||
|
||
[23](#forward.list.ops-23)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L7752)
|
||
|
||
*Complexity*: If empty() is false,
|
||
exactly distance(begin(), end()) - 1 applications of
|
||
the corresponding predicate,
|
||
otherwise no applications of the predicate[.](#forward.list.ops-23.sentence-1)
|
||
|
||
[ð](#lib:merge,forward_list)
|
||
|
||
`constexpr void merge(forward_list& x);
|
||
constexpr void merge(forward_list&& x);
|
||
template<class Compare> constexpr void merge(forward_list& x, Compare comp);
|
||
template<class Compare> constexpr void merge(forward_list&& x, Compare comp);
|
||
`
|
||
|
||
[24](#forward.list.ops-24)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L7769)
|
||
|
||
Let comp be less<> for the first two overloads[.](#forward.list.ops-24.sentence-1)
|
||
|
||
[25](#forward.list.ops-25)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L7772)
|
||
|
||
*Preconditions*: *this and x are both sorted
|
||
with respect to the comparator comp, andget_allocator() == x.get_allocator() is true[.](#forward.list.ops-25.sentence-1)
|
||
|
||
[26](#forward.list.ops-26)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L7778)
|
||
|
||
*Effects*: If addressof(x) == this, there are no effects[.](#forward.list.ops-26.sentence-1)
|
||
|
||
Otherwise, merges
|
||
the two sorted ranges [begin(), end()) and [x.begin(), x.end())[.](#forward.list.ops-26.sentence-2)
|
||
|
||
The result is a range
|
||
that is sorted with respect to the comparator comp[.](#forward.list.ops-26.sentence-3)
|
||
|
||
Pointers and references to the moved elements of x now refer to those same elements
|
||
but as members of *this[.](#forward.list.ops-26.sentence-4)
|
||
|
||
Iterators referring to the moved elements will continue to
|
||
refer to their elements, but they now behave as iterators into *this, not intox[.](#forward.list.ops-26.sentence-5)
|
||
|
||
[27](#forward.list.ops-27)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L7790)
|
||
|
||
*Complexity*: At most distance(begin(),
|
||
end()) + distance(x.begin(), x.end()) - 1 comparisons
|
||
if addressof(x) != this; otherwise, no comparisons are performed[.](#forward.list.ops-27.sentence-1)
|
||
|
||
[28](#forward.list.ops-28)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L7796)
|
||
|
||
*Remarks*: Stable ([[algorithm.stable]](algorithm.stable "16.4.6.8 Requirements for stable algorithms"))[.](#forward.list.ops-28.sentence-1)
|
||
|
||
If addressof(x) != this, x is empty after the merge[.](#forward.list.ops-28.sentence-2)
|
||
|
||
No elements are copied by this operation[.](#forward.list.ops-28.sentence-3)
|
||
|
||
If an exception is thrown other than by a comparison, there are no effects[.](#forward.list.ops-28.sentence-4)
|
||
|
||
[ð](#lib:sort,forward_list)
|
||
|
||
`constexpr void sort();
|
||
template<class Compare> constexpr void sort(Compare comp);
|
||
`
|
||
|
||
[29](#forward.list.ops-29)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L7811)
|
||
|
||
*Effects*: Sorts the list according to the operator< or the comp function object[.](#forward.list.ops-29.sentence-1)
|
||
|
||
If an exception is thrown, the order of the elements in *this is unspecified[.](#forward.list.ops-29.sentence-2)
|
||
|
||
Does not affect the validity of iterators and references[.](#forward.list.ops-29.sentence-3)
|
||
|
||
[30](#forward.list.ops-30)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L7817)
|
||
|
||
*Complexity*: Approximately NlogN comparisons, where N is distance(begin(), end())[.](#forward.list.ops-30.sentence-1)
|
||
|
||
[31](#forward.list.ops-31)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L7821)
|
||
|
||
*Remarks*: [Stable](algorithm.stable "16.4.6.8 Requirements for stable algorithms [algorithm.stable]")[.](#forward.list.ops-31.sentence-1)
|
||
|
||
[ð](#lib:reverse,forward_list)
|
||
|
||
`constexpr void reverse() noexcept;
|
||
`
|
||
|
||
[32](#forward.list.ops-32)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L7832)
|
||
|
||
*Effects*: Reverses the order of the elements in the list[.](#forward.list.ops-32.sentence-1)
|
||
|
||
Does not affect the validity of iterators and references[.](#forward.list.ops-32.sentence-2)
|
||
|
||
[33](#forward.list.ops-33)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L7837)
|
||
|
||
*Complexity*: Linear time[.](#forward.list.ops-33.sentence-1)
|
||
|
||
#### [23.3.7.7](#forward.list.erasure) Erasure [[forward.list.erasure]](forward.list.erasure)
|
||
|
||
[ð](#lib:erase,forward_list)
|
||
|
||
`template<class T, class Allocator, class U = T>
|
||
constexpr typename forward_list<T, Allocator>::size_type
|
||
erase(forward_list<T, Allocator>& c, const U& value);
|
||
`
|
||
|
||
[1](#forward.list.erasure-1)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L7852)
|
||
|
||
*Effects*: Equivalent to:return erase_if(c, [&](const auto& elem) -> bool { return elem == value; });
|
||
|
||
[ð](#lib:erase_if,forward_list)
|
||
|
||
`template<class T, class Allocator, class Predicate>
|
||
constexpr typename forward_list<T, Allocator>::size_type
|
||
erase_if(forward_list<T, Allocator>& c, Predicate pred);
|
||
`
|
||
|
||
[2](#forward.list.erasure-2)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L7868)
|
||
|
||
*Effects*: Equivalent to: return c.remove_if(pred);
|
||
|
||
### [23.3.8](#hive.syn) Header <hive> synopsis [[hive.syn]](hive.syn)
|
||
|
||
[ð](#header:%3chive%3e)
|
||
|
||
#include <initializer_list> // see [[initializer.list.syn]](initializer.list.syn "17.11.2 Header <initializer_list> synopsis")#include <compare> // see [[compare.syn]](compare.syn "17.12.1 Header <compare> synopsis")namespace std {struct [hive_limits](#lib:hive_limits "23.3.8 Header <hive> synopsis [hive.syn]") { size_t [min](#lib:hive_limits,min "23.3.8 Header <hive> synopsis [hive.syn]");
|
||
size_t [max](#lib:hive_limits,max "23.3.8 Header <hive> synopsis [hive.syn]"); constexpr hive_limits(size_t minimum, size_t maximum) noexcept: min(minimum), max(maximum) {}}; // [[hive]](#hive "23.3.9 Class template hive"), class template hivetemplate<class T, class Allocator = allocator<T>> class hive; template<class T, class Allocator>void swap(hive<T, Allocator>& x, hive<T, Allocator>& y)noexcept(noexcept(x.swap(y))); template<class T, class Allocator, class U = T>typename hive<T, Allocator>::size_type
|
||
erase(hive<T, Allocator>& c, const U& value); template<class T, class Allocator, class Predicate>typename hive<T, Allocator>::size_type
|
||
erase_if(hive<T, Allocator>& c, Predicate pred); namespace pmr {template<class T>using hive = std::hive<T, polymorphic_allocator<T>>; }}
|
||
|
||
### [23.3.9](#hive) Class template hive [[hive]](hive)
|
||
|
||
#### [23.3.9.1](#hive.overview) Overview [[hive.overview]](hive.overview)
|
||
|
||
[1](#hive.overview-1)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L7915)
|
||
|
||
A hive is a type of sequence container
|
||
that provides constant-time insertion and erasure operations[.](#hive.overview-1.sentence-1)
|
||
|
||
Storage is automatically managed in multiple memory blocks,
|
||
referred to as [*element blocks*](#def:element_block "23.3.9.1 Overview [hive.overview]")[.](#hive.overview-1.sentence-2)
|
||
|
||
Insertion position is determined by the container, and insertion
|
||
may re-use the memory locations of erased elements[.](#hive.overview-1.sentence-3)
|
||
|
||
[2](#hive.overview-2)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L7923)
|
||
|
||
Element blocks which contain elements are referred to
|
||
as [*active blocks*](#def:block,active "23.3.9.1 Overview [hive.overview]"),
|
||
those which do not are referred to as [*reserved blocks*](#def:block,reserved "23.3.9.1 Overview [hive.overview]")[.](#hive.overview-2.sentence-1)
|
||
|
||
Active blocks which become empty of elements are
|
||
either deallocated or become reserved blocks[.](#hive.overview-2.sentence-2)
|
||
|
||
Reserved blocks become active blocks when they are used to store elements[.](#hive.overview-2.sentence-3)
|
||
|
||
A user can create additional reserved blocks by calling reserve[.](#hive.overview-2.sentence-4)
|
||
|
||
[3](#hive.overview-3)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L7932)
|
||
|
||
Erasures use unspecified techniques of constant time complexity
|
||
to identify the memory locations of erased elements,
|
||
which are subsequently skipped during iteration,
|
||
as opposed to relocating subsequent elements during erasure[.](#hive.overview-3.sentence-1)
|
||
|
||
[4](#hive.overview-4)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L7938)
|
||
|
||
Active block capacities have
|
||
an implementation-defined growth factor
|
||
(which need not be integral),
|
||
for example a new active block's capacity could be equal to
|
||
the summed capacities of the pre-existing active blocks[.](#hive.overview-4.sentence-1)
|
||
|
||
[5](#hive.overview-5)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L7945)
|
||
|
||
Limits can be placed on
|
||
both the minimum and maximum element capacities of element blocks,
|
||
both by users and implementations[.](#hive.overview-5.sentence-1)
|
||
|
||
- [(5.1)](#hive.overview-5.1)
|
||
|
||
The minimum limit shall be no larger than the maximum limit[.](#hive.overview-5.1.sentence-1)
|
||
|
||
- [(5.2)](#hive.overview-5.2)
|
||
|
||
When limits are not specified by a user during construction,
|
||
the implementation's default limits are used[.](#hive.overview-5.2.sentence-1)
|
||
|
||
- [(5.3)](#hive.overview-5.3)
|
||
|
||
The default limits of an implementation are not guaranteed to be the same as
|
||
the minimum and maximum possible capacities
|
||
for an implementation's element blocks[.](#hive.overview-5.3.sentence-1)
|
||
[*Note [1](#hive.overview-note-1)*:
|
||
To allow latitude for
|
||
both implementation-specific and user-directed optimization[.](#hive.overview-5.3.sentence-2)
|
||
â *end note*]
|
||
The latter are defined as hard limits[.](#hive.overview-5.3.sentence-3)
|
||
The maximum hard limit shall be no larger thanstd::allocator_traits<Allocator>::max_size()[.](#hive.overview-5.3.sentence-4)
|
||
|
||
- [(5.4)](#hive.overview-5.4)
|
||
|
||
If user-specified limits are not within hard limits, or
|
||
if the specified minimum limit is greater than the specified maximum limit,
|
||
the behavior is undefined[.](#hive.overview-5.4.sentence-1)
|
||
|
||
- [(5.5)](#hive.overview-5.5)
|
||
|
||
An element block is said to be [*within the bounds*](#def:element_block,bounds "23.3.9.1 Overview [hive.overview]") of a pair of minimum/maximum limits
|
||
when its capacity is greater-or-equal-to the minimum limit and
|
||
less-than-or-equal-to the maximum limit[.](#hive.overview-5.5.sentence-1)
|
||
|
||
[6](#hive.overview-6)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L7977)
|
||
|
||
A hive conforms to
|
||
the requirements for containers ([[container.reqmts]](container.reqmts "23.2.2.2 Container requirements")),
|
||
with the exception of operators == and !=[.](#hive.overview-6.sentence-1)
|
||
|
||
A hive also meets the requirements
|
||
of a reversible container ([[container.rev.reqmts]](container.rev.reqmts "23.2.2.3 Reversible container requirements")),
|
||
of an allocator-aware container ([[container.alloc.reqmts]](container.alloc.reqmts "23.2.2.5 Allocator-aware containers")), and
|
||
some of the requirements of a sequence container ([[sequence.reqmts]](sequence.reqmts "23.2.4 Sequence containers"))[.](#hive.overview-6.sentence-2)
|
||
|
||
Descriptions are provided here only for operations on hive that are not described in that table or for operations
|
||
where there is additional semantic information[.](#hive.overview-6.sentence-3)
|
||
|
||
[7](#hive.overview-7)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L7989)
|
||
|
||
The iterators of hive meet
|
||
the *Cpp17BidirectionalIterator* requirements
|
||
but also model [three_way_comparable](cmp.concept#concept:three_way_comparable "17.12.4 Concept three_way_comparable [cmp.concept]")<strong_ordering>[.](#hive.overview-7.sentence-1)
|
||
|
||
namespace std {template<class T, class Allocator = allocator<T>>class [hive](#lib:hive "23.3.9.1 Overview [hive.overview]") {public:// typesusing value_type = T; using allocator_type = Allocator; using pointer = typename allocator_traits<Allocator>::pointer; using const_pointer = typename allocator_traits<Allocator>::const_pointer; using reference = value_type&; using const_reference = const value_type&; using size_type = *implementation-defined*; // see [[container.requirements]](container.requirements "23.2 Requirements")using difference_type = *implementation-defined*; // see [[container.requirements]](container.requirements "23.2 Requirements")using iterator = *implementation-defined*; // see [[container.requirements]](container.requirements "23.2 Requirements")using const_iterator = *implementation-defined*; // see [[container.requirements]](container.requirements "23.2 Requirements")using reverse_iterator = std::reverse_iterator<iterator>; // see [[container.requirements]](container.requirements "23.2 Requirements")using const_reverse_iterator = std::reverse_iterator<const_iterator>; // see [[container.requirements]](container.requirements "23.2 Requirements")// [[hive.cons]](#hive.cons "23.3.9.2 Constructors, copy, and assignment"), construct/copy/destroyconstexpr hive() noexcept(noexcept(Allocator())) : hive(Allocator()) {}constexpr explicit hive(const Allocator&) noexcept; constexpr explicit hive(hive_limits block_limits) : hive(block_limits, Allocator()) {}constexpr hive(hive_limits block_limits, const Allocator&); explicit hive(size_type n, const Allocator& = Allocator());
|
||
hive(size_type n, hive_limits block_limits, const Allocator& = Allocator());
|
||
hive(size_type n, const T& value, const Allocator& = Allocator());
|
||
hive(size_type n, const T& value, hive_limits block_limits, const Allocator& = Allocator()); template<class InputIterator> hive(InputIterator first, InputIterator last, const Allocator& = Allocator()); template<class InputIterator> hive(InputIterator first, InputIterator last, hive_limits block_limits, const Allocator& = Allocator()); template<[*container-compatible-range*](container.intro.reqmts#concept:container-compatible-range "23.2.2.1 Introduction [container.intro.reqmts]")<T> R> hive(from_range_t, R&& rg, const Allocator& = Allocator()); template<[*container-compatible-range*](container.intro.reqmts#concept:container-compatible-range "23.2.2.1 Introduction [container.intro.reqmts]")<T> R> hive(from_range_t, R&& rg, hive_limits block_limits, const Allocator& = Allocator());
|
||
hive(const hive& x);
|
||
hive(hive&&) noexcept;
|
||
hive(const hive& x, const type_identity_t<Allocator>& alloc);
|
||
hive(hive&&, const type_identity_t<Allocator>& alloc);
|
||
hive(initializer_list<T> il, const Allocator& = Allocator());
|
||
hive(initializer_list<T> il, hive_limits block_limits, const Allocator& = Allocator()); ~hive();
|
||
|
||
hive& operator=(const hive& x);
|
||
hive& operator=(hive&& x) noexcept(*see below*);
|
||
hive& operator=(initializer_list<T>); template<class InputIterator>void assign(InputIterator first, InputIterator last); template<[*container-compatible-range*](container.intro.reqmts#concept:container-compatible-range "23.2.2.1 Introduction [container.intro.reqmts]")<T> R>void assign_range(R&& rg); void assign(size_type n, const T& t); void assign(initializer_list<T>);
|
||
allocator_type get_allocator() const noexcept; // iterators iterator begin() noexcept;
|
||
const_iterator begin() const noexcept;
|
||
iterator end() noexcept;
|
||
const_iterator end() const noexcept;
|
||
reverse_iterator rbegin() noexcept;
|
||
const_reverse_iterator rbegin() const noexcept;
|
||
reverse_iterator rend() noexcept;
|
||
const_reverse_iterator rend() const noexcept;
|
||
const_iterator cbegin() const noexcept;
|
||
const_iterator cend() const noexcept;
|
||
const_reverse_iterator crbegin() const noexcept;
|
||
const_reverse_iterator crend() const noexcept; // [[hive.capacity]](#hive.capacity "23.3.9.3 Capacity"), capacitybool empty() const noexcept;
|
||
size_type size() const noexcept;
|
||
size_type max_size() const noexcept;
|
||
size_type capacity() const noexcept; void reserve(size_type n); void shrink_to_fit(); void trim_capacity() noexcept; void trim_capacity(size_type n) noexcept; constexpr hive_limits block_capacity_limits() const noexcept; static constexpr hive_limits block_capacity_default_limits() noexcept; static constexpr hive_limits block_capacity_hard_limits() noexcept; void reshape(hive_limits block_limits); // [[hive.modifiers]](#hive.modifiers "23.3.9.4 Modifiers"), modifierstemplate<class... Args> iterator emplace(Args&&... args); template<class... Args> iterator emplace_hint(const_iterator hint, Args&&... args);
|
||
iterator insert(const T& x);
|
||
iterator insert(T&& x);
|
||
iterator insert(const_iterator hint, const T& x);
|
||
iterator insert(const_iterator hint, T&& x); void insert(initializer_list<T> il); template<[*container-compatible-range*](container.intro.reqmts#concept:container-compatible-range "23.2.2.1 Introduction [container.intro.reqmts]")<T> R>void insert_range(R&& rg); template<class InputIterator>void insert(InputIterator first, InputIterator last); void insert(size_type n, const T& x);
|
||
|
||
iterator erase(const_iterator position);
|
||
iterator erase(const_iterator first, const_iterator last); void swap(hive&) noexcept(*see below*); void clear() noexcept; // [[hive.operations]](#hive.operations "23.3.9.5 Operations"), hive operationsvoid splice(hive& x); void splice(hive&& x); template<class BinaryPredicate = equal_to<T>> size_type unique(BinaryPredicate binary_pred = BinaryPredicate()); template<class Compare = less<T>>void sort(Compare comp = Compare());
|
||
|
||
iterator get_iterator(const_pointer p) noexcept;
|
||
const_iterator get_iterator(const_pointer p) const noexcept; private: hive_limits *current-limits* = *implementation-defined*; // *exposition only*}; template<class InputIterator, class Allocator = allocator<*iter-value-type*<InputIterator>>> hive(InputIterator, InputIterator, Allocator = Allocator())-> hive<*iter-value-type*<InputIterator>, Allocator>; template<class InputIterator, class Allocator = allocator<*iter-value-type*<InputIterator>>> hive(InputIterator, InputIterator, hive_limits, Allocator = Allocator())-> hive<*iter-value-type*<InputIterator>, Allocator>; template<ranges::[input_range](range.refinements#concept:input_range "25.4.6 Other range refinements [range.refinements]") R, class Allocator = allocator<ranges::range_value_t<R>>> hive(from_range_t, R&&, Allocator = Allocator())-> hive<ranges::range_value_t<R>, Allocator>; template<ranges::[input_range](range.refinements#concept:input_range "25.4.6 Other range refinements [range.refinements]") R, class Allocator = allocator<ranges::range_value_t<R>>> hive(from_range_t, R&&, hive_limits, Allocator = Allocator())-> hive<ranges::range_value_t<R>, Allocator>;}
|
||
|
||
#### [23.3.9.2](#hive.cons) Constructors, copy, and assignment [[hive.cons]](hive.cons)
|
||
|
||
[ð](#lib:hive,constructor)
|
||
|
||
`constexpr explicit hive(const Allocator&) noexcept;
|
||
`
|
||
|
||
[1](#hive.cons-1)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L8139)
|
||
|
||
*Effects*: Constructs an empty hive, using the specified allocator[.](#hive.cons-1.sentence-1)
|
||
|
||
[2](#hive.cons-2)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L8143)
|
||
|
||
*Complexity*: Constant[.](#hive.cons-2.sentence-1)
|
||
|
||
[ð](#lib:hive,constructor_)
|
||
|
||
`constexpr hive(hive_limits block_limits, const Allocator&);
|
||
`
|
||
|
||
[3](#hive.cons-3)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L8154)
|
||
|
||
*Effects*: Constructs an empty hive, using the specified allocator[.](#hive.cons-3.sentence-1)
|
||
|
||
Initializes *current-limits* with block_limits[.](#hive.cons-3.sentence-2)
|
||
|
||
[4](#hive.cons-4)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L8159)
|
||
|
||
*Complexity*: Constant[.](#hive.cons-4.sentence-1)
|
||
|
||
[ð](#lib:hive,constructor__)
|
||
|
||
`explicit hive(size_type n, const Allocator& = Allocator());
|
||
hive(size_type n, hive_limits block_limits, const Allocator& = Allocator());
|
||
`
|
||
|
||
[5](#hive.cons-5)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L8171)
|
||
|
||
*Preconditions*: T is *Cpp17DefaultInsertable* into hive[.](#hive.cons-5.sentence-1)
|
||
|
||
[6](#hive.cons-6)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L8175)
|
||
|
||
*Effects*: Constructs a hive with n default-inserted elements,
|
||
using the specified allocator[.](#hive.cons-6.sentence-1)
|
||
|
||
If the second overload is called,
|
||
also initializes *current-limits* with block_limits[.](#hive.cons-6.sentence-2)
|
||
|
||
[7](#hive.cons-7)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L8182)
|
||
|
||
*Complexity*: Linear in n[.](#hive.cons-7.sentence-1)
|
||
|
||
[ð](#lib:hive,constructor___)
|
||
|
||
`hive(size_type n, const T& value, const Allocator& = Allocator());
|
||
hive(size_type n, const T& value, hive_limits block_limits, const Allocator& = Allocator());
|
||
`
|
||
|
||
[8](#hive.cons-8)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L8194)
|
||
|
||
*Preconditions*: T is *Cpp17CopyInsertable* into hive[.](#hive.cons-8.sentence-1)
|
||
|
||
[9](#hive.cons-9)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L8198)
|
||
|
||
*Effects*: Constructs a hive with n copies of value,
|
||
using the specified allocator[.](#hive.cons-9.sentence-1)
|
||
|
||
If the second overload is called,
|
||
also initializes *current-limits* with block_limits[.](#hive.cons-9.sentence-2)
|
||
|
||
[10](#hive.cons-10)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L8205)
|
||
|
||
*Complexity*: Linear in n[.](#hive.cons-10.sentence-1)
|
||
|
||
[ð](#lib:hive,constructor____)
|
||
|
||
`template<class InputIterator>
|
||
hive(InputIterator first, InputIterator last, const Allocator& = Allocator());
|
||
template<class InputIterator>
|
||
hive(InputIterator first, InputIterator last, hive_limits block_limits,
|
||
const Allocator& = Allocator());
|
||
`
|
||
|
||
[11](#hive.cons-11)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L8220)
|
||
|
||
*Effects*: Constructs a hive equal to the range [first, last),
|
||
using the specified allocator[.](#hive.cons-11.sentence-1)
|
||
|
||
If the second overload is called,
|
||
also initializes *current-limits* with block_limits[.](#hive.cons-11.sentence-2)
|
||
|
||
[12](#hive.cons-12)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L8227)
|
||
|
||
*Complexity*: Linear in distance(first, last)[.](#hive.cons-12.sentence-1)
|
||
|
||
[ð](#lib:hive,constructor_____)
|
||
|
||
`template<[container-compatible-range](container.intro.reqmts#concept:container-compatible-range "23.2.2.1 Introduction [container.intro.reqmts]")<T> R>
|
||
hive(from_range_t, R&& rg, const Allocator& = Allocator());
|
||
template<[container-compatible-range](container.intro.reqmts#concept:container-compatible-range "23.2.2.1 Introduction [container.intro.reqmts]")<T> R>
|
||
hive(from_range_t, R&& rg, hive_limits block_limits, const Allocator& = Allocator());
|
||
`
|
||
|
||
[13](#hive.cons-13)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L8241)
|
||
|
||
*Effects*: Constructs a hive object with the elements of the range rg,
|
||
using the specified allocator[.](#hive.cons-13.sentence-1)
|
||
|
||
If the second overload is called,
|
||
also initializes *current-limits* with block_limits[.](#hive.cons-13.sentence-2)
|
||
|
||
[14](#hive.cons-14)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L8248)
|
||
|
||
*Complexity*: Linear in ranges::distance(rg)[.](#hive.cons-14.sentence-1)
|
||
|
||
[ð](#lib:hive,constructor______)
|
||
|
||
`hive(const hive& x);
|
||
hive(const hive& x, const type_identity_t<Allocator>& alloc);
|
||
`
|
||
|
||
[15](#hive.cons-15)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L8260)
|
||
|
||
*Preconditions*: T is *Cpp17CopyInsertable* into hive[.](#hive.cons-15.sentence-1)
|
||
|
||
[16](#hive.cons-16)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L8264)
|
||
|
||
*Effects*: Constructs a hive object with the elements of x[.](#hive.cons-16.sentence-1)
|
||
|
||
If the second overload is called, uses alloc[.](#hive.cons-16.sentence-2)
|
||
|
||
Initializes *current-limits* with x.*current-limits*[.](#hive.cons-16.sentence-3)
|
||
|
||
[17](#hive.cons-17)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L8270)
|
||
|
||
*Complexity*: Linear in x.size()[.](#hive.cons-17.sentence-1)
|
||
|
||
[ð](#lib:hive,constructor_______)
|
||
|
||
`hive(hive&& x) noexcept;
|
||
hive(hive&& x, const type_identity_t<Allocator>& alloc);
|
||
`
|
||
|
||
[18](#hive.cons-18)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L8282)
|
||
|
||
*Preconditions*: For the second overload,
|
||
when allocator_traits<alloc>::is_always_equal::value is false,T meets the *Cpp17MoveInsertable* requirements[.](#hive.cons-18.sentence-1)
|
||
|
||
[19](#hive.cons-19)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L8288)
|
||
|
||
*Effects*: When the first overload is called, or
|
||
the second overload is called andalloc == x.get_allocator() is true,*current-limits* is set to x.*current-limits* and
|
||
each element block is moved from x into *this[.](#hive.cons-19.sentence-1)
|
||
|
||
Pointers and references to the elements of x now refer to
|
||
those same elements but as members of *this[.](#hive.cons-19.sentence-2)
|
||
|
||
Iterators referring to the elements of x will continue to refer to their elements,
|
||
but they now behave as iterators into *this[.](#hive.cons-19.sentence-3)
|
||
|
||
If the second overload is called andalloc == x.get_allocator() is false,
|
||
each element in x is moved into *this[.](#hive.cons-19.sentence-4)
|
||
|
||
References, pointers and iterators referring to the elements of x, as well as the past-the-end iterator of x, are invalidated[.](#hive.cons-19.sentence-5)
|
||
|
||
[20](#hive.cons-20)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L8306)
|
||
|
||
*Postconditions*: x.empty() is true[.](#hive.cons-20.sentence-1)
|
||
|
||
[21](#hive.cons-21)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L8310)
|
||
|
||
*Complexity*: If the second overload is called andalloc == x.get_allocator() is false, linear in x.size()[.](#hive.cons-21.sentence-1)
|
||
|
||
Otherwise constant[.](#hive.cons-21.sentence-2)
|
||
|
||
[ð](#lib:hive,constructor________)
|
||
|
||
`hive(initializer_list<T> il, const Allocator& = Allocator());
|
||
hive(initializer_list<T> il, hive_limits block_limits, const Allocator& = Allocator());
|
||
`
|
||
|
||
[22](#hive.cons-22)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L8324)
|
||
|
||
*Preconditions*: T is *Cpp17CopyInsertable* into hive[.](#hive.cons-22.sentence-1)
|
||
|
||
[23](#hive.cons-23)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L8328)
|
||
|
||
*Effects*: Constructs a hive object with the elements of il,
|
||
using the specified allocator[.](#hive.cons-23.sentence-1)
|
||
|
||
If the second overload is called,
|
||
also initializes *current-limits* with block_limits[.](#hive.cons-23.sentence-2)
|
||
|
||
[24](#hive.cons-24)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L8335)
|
||
|
||
*Complexity*: Linear in il.size()[.](#hive.cons-24.sentence-1)
|
||
|
||
[ð](#lib:operator=,hive)
|
||
|
||
`hive& operator=(const hive& x);
|
||
`
|
||
|
||
[25](#hive.cons-25)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L8346)
|
||
|
||
*Preconditions*: T is *Cpp17CopyInsertable* into hive and*Cpp17CopyAssignable*[.](#hive.cons-25.sentence-1)
|
||
|
||
[26](#hive.cons-26)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L8351)
|
||
|
||
*Effects*: All elements in *this are either copy-assigned to, or destroyed[.](#hive.cons-26.sentence-1)
|
||
|
||
All elements in x are copied into *this[.](#hive.cons-26.sentence-2)
|
||
|
||
[*Note [1](#hive.cons-note-1)*:
|
||
|
||
*current-limits* is unchanged[.](#hive.cons-26.sentence-3)
|
||
|
||
â *end note*]
|
||
|
||
[27](#hive.cons-27)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L8359)
|
||
|
||
*Complexity*: Linear in size() + x.size()[.](#hive.cons-27.sentence-1)
|
||
|
||
[ð](#lib:operator=,hive_)
|
||
|
||
`hive& operator=(hive&& x)
|
||
noexcept(allocator_traits<Allocator>::propagate_on_container_move_assignment::value ||
|
||
allocator_traits<Allocator>::is_always_equal::value);
|
||
`
|
||
|
||
[28](#hive.cons-28)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L8372)
|
||
|
||
*Preconditions*: When(allocator_traits<Allocator>::propagate_on_container_move_assignment::value || allocator_traits<Allocator>::is_always_equal::value) is false,T is *Cpp17MoveInsertable* into hive and*Cpp17MoveAssignable*[.](#hive.cons-28.sentence-1)
|
||
|
||
[29](#hive.cons-29)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L8383)
|
||
|
||
*Effects*: Each element in *this is either move-assigned to, or destroyed[.](#hive.cons-29.sentence-1)
|
||
|
||
When(allocator_traits<Allocator>::propagate_on_container_move_assignment::value || get_allocator() == x.get_allocator()) is true,*current-limits* is set to x.*current-limits* and
|
||
each element block is moved from x into *this[.](#hive.cons-29.sentence-2)
|
||
|
||
Pointers and references to the elements of x now refer to those same elements but as members of *this[.](#hive.cons-29.sentence-3)
|
||
|
||
Iterators referring to the elements of x will continue to refer to their elements,
|
||
but they now behave as iterators into *this, not into x[.](#hive.cons-29.sentence-4)
|
||
|
||
When(allocator_traits<Allocator>::propagate_on_container_move_assignment::value || get_allocator() == x.get_allocator()) is false,
|
||
each element in x is moved into *this[.](#hive.cons-29.sentence-5)
|
||
|
||
References, pointers and iterators referring to the elements of x,
|
||
as well as the past-the-end iterator of x, are invalidated[.](#hive.cons-29.sentence-6)
|
||
|
||
[30](#hive.cons-30)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L8410)
|
||
|
||
*Postconditions*: x.empty() is true[.](#hive.cons-30.sentence-1)
|
||
|
||
[31](#hive.cons-31)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L8414)
|
||
|
||
*Complexity*: Linear in size()[.](#hive.cons-31.sentence-1)
|
||
|
||
If(allocator_traits<Allocator>::propagate_on_container_move_assignment::value || get_allocator() == x.get_allocator()) is false, also linear in x.size()[.](#hive.cons-31.sentence-2)
|
||
|
||
#### [23.3.9.3](#hive.capacity) Capacity [[hive.capacity]](hive.capacity)
|
||
|
||
[ð](#lib:capacity,hive)
|
||
|
||
`size_type capacity() const noexcept;
|
||
`
|
||
|
||
[1](#hive.capacity-1)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L8433)
|
||
|
||
*Returns*: The total number of elements that *this can hold
|
||
without requiring allocation of more element blocks[.](#hive.capacity-1.sentence-1)
|
||
|
||
[2](#hive.capacity-2)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L8438)
|
||
|
||
*Complexity*: Constant[.](#hive.capacity-2.sentence-1)
|
||
|
||
[ð](#lib:reserve,hive)
|
||
|
||
`void reserve(size_type n);
|
||
`
|
||
|
||
[3](#hive.capacity-3)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L8449)
|
||
|
||
*Effects*: If n <= capacity() is true, there are no effects[.](#hive.capacity-3.sentence-1)
|
||
|
||
Otherwise increases capacity() by allocating reserved blocks[.](#hive.capacity-3.sentence-2)
|
||
|
||
[4](#hive.capacity-4)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L8454)
|
||
|
||
*Postconditions*: capacity() >= n is true[.](#hive.capacity-4.sentence-1)
|
||
|
||
[5](#hive.capacity-5)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L8458)
|
||
|
||
*Throws*: length_error if n > max_size(),
|
||
as well as any exceptions thrown by the allocator[.](#hive.capacity-5.sentence-1)
|
||
|
||
[6](#hive.capacity-6)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L8463)
|
||
|
||
*Complexity*: It does not change the size of the sequence and
|
||
takes at most linear time in the number of reserved blocks allocated[.](#hive.capacity-6.sentence-1)
|
||
|
||
[7](#hive.capacity-7)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L8468)
|
||
|
||
*Remarks*: All references, pointers, and iterators referring to elements in *this,
|
||
as well as the past-the-end iterator, remain valid[.](#hive.capacity-7.sentence-1)
|
||
|
||
[ð](#lib:shrink_to_fit,hive)
|
||
|
||
`void shrink_to_fit();
|
||
`
|
||
|
||
[8](#hive.capacity-8)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L8480)
|
||
|
||
*Preconditions*: T is *Cpp17MoveInsertable* into hive[.](#hive.capacity-8.sentence-1)
|
||
|
||
[9](#hive.capacity-9)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L8484)
|
||
|
||
*Effects*: shrink_to_fit is a non-binding request
|
||
to reduce capacity() to be closer to size()[.](#hive.capacity-9.sentence-1)
|
||
|
||
[*Note [1](#hive.capacity-note-1)*:
|
||
|
||
The request is non-binding
|
||
to allow latitude for implementation-specific optimizations[.](#hive.capacity-9.sentence-2)
|
||
|
||
â *end note*]
|
||
|
||
It does not increase capacity(), but may reduce capacity()[.](#hive.capacity-9.sentence-3)
|
||
|
||
It may reallocate elements[.](#hive.capacity-9.sentence-4)
|
||
|
||
If capacity() is already equal to size(), there are no effects[.](#hive.capacity-9.sentence-5)
|
||
|
||
If an exception is thrown during allocation of a new element block,capacity() may be reduced and reallocation may occur[.](#hive.capacity-9.sentence-6)
|
||
|
||
Otherwise if an exception is thrown, the effects are unspecified[.](#hive.capacity-9.sentence-7)
|
||
|
||
[10](#hive.capacity-10)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L8499)
|
||
|
||
*Complexity*: If reallocation happens, linear in the size of the sequence[.](#hive.capacity-10.sentence-1)
|
||
|
||
[11](#hive.capacity-11)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L8503)
|
||
|
||
*Remarks*: If reallocation happens,
|
||
the order of the elements in *this may change and
|
||
all references, pointers, and iterators
|
||
referring to the elements in *this,
|
||
as well as the past-the-end iterator, are invalidated[.](#hive.capacity-11.sentence-1)
|
||
|
||
[ð](#lib:trim_capacity,hive)
|
||
|
||
`void trim_capacity() noexcept;
|
||
void trim_capacity(size_type n) noexcept;
|
||
`
|
||
|
||
[12](#hive.capacity-12)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L8519)
|
||
|
||
*Effects*: For the first overload, all reserved blocks are deallocated, andcapacity() is reduced accordingly[.](#hive.capacity-12.sentence-1)
|
||
|
||
For the second overload, capacity() is reduced to no less than n[.](#hive.capacity-12.sentence-2)
|
||
|
||
[13](#hive.capacity-13)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L8525)
|
||
|
||
*Complexity*: Linear in the number of reserved blocks deallocated[.](#hive.capacity-13.sentence-1)
|
||
|
||
[14](#hive.capacity-14)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L8529)
|
||
|
||
*Remarks*: All references, pointers, and iterators referring to elements in *this,
|
||
as well as the past-the-end iterator, remain valid[.](#hive.capacity-14.sentence-1)
|
||
|
||
[ð](#lib:block_capacity_limits,hive)
|
||
|
||
`constexpr hive_limits block_capacity_limits() const noexcept;
|
||
`
|
||
|
||
[15](#hive.capacity-15)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L8541)
|
||
|
||
*Returns*: *current-limits*[.](#hive.capacity-15.sentence-1)
|
||
|
||
[16](#hive.capacity-16)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L8545)
|
||
|
||
*Complexity*: Constant[.](#hive.capacity-16.sentence-1)
|
||
|
||
[ð](#lib:block_capacity_default_limits,hive)
|
||
|
||
`static constexpr hive_limits block_capacity_default_limits() noexcept;
|
||
`
|
||
|
||
[17](#hive.capacity-17)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L8556)
|
||
|
||
*Returns*: A hive_limits struct
|
||
with the min and max members set to
|
||
the implementation's default limits[.](#hive.capacity-17.sentence-1)
|
||
|
||
[18](#hive.capacity-18)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L8562)
|
||
|
||
*Complexity*: Constant[.](#hive.capacity-18.sentence-1)
|
||
|
||
[ð](#lib:block_capacity_hard_limits,hive)
|
||
|
||
`static constexpr hive_limits block_capacity_hard_limits() noexcept;
|
||
`
|
||
|
||
[19](#hive.capacity-19)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L8573)
|
||
|
||
*Returns*: A hive_limits struct
|
||
with the min and max members set to
|
||
the implementation's hard limits[.](#hive.capacity-19.sentence-1)
|
||
|
||
[20](#hive.capacity-20)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L8579)
|
||
|
||
*Complexity*: Constant[.](#hive.capacity-20.sentence-1)
|
||
|
||
[ð](#lib:reshape,hive)
|
||
|
||
`void reshape(hive_limits block_limits);
|
||
`
|
||
|
||
[21](#hive.capacity-21)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L8590)
|
||
|
||
*Preconditions*: T is *Cpp17MoveInsertable* into hive[.](#hive.capacity-21.sentence-1)
|
||
|
||
[22](#hive.capacity-22)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L8594)
|
||
|
||
*Effects*: For any active blocks not within the bounds of block_limits,
|
||
the elements within those active blocks are reallocated
|
||
to new or existing element blocks which are within the bounds[.](#hive.capacity-22.sentence-1)
|
||
|
||
Any element blocks not within the bounds of block_limits are deallocated[.](#hive.capacity-22.sentence-2)
|
||
|
||
If an exception is thrown during allocation of a new element block,capacity() may be reduced,
|
||
reallocation may occur, and*current-limits* may be assigned
|
||
a value other than block_limits[.](#hive.capacity-22.sentence-3)
|
||
|
||
Otherwise block_limits is assigned to *current-limits*[.](#hive.capacity-22.sentence-4)
|
||
|
||
If any other exception is thrown the effects are unspecified[.](#hive.capacity-22.sentence-5)
|
||
|
||
[23](#hive.capacity-23)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L8609)
|
||
|
||
*Postconditions*: size() is unchanged[.](#hive.capacity-23.sentence-1)
|
||
|
||
[24](#hive.capacity-24)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L8613)
|
||
|
||
*Complexity*: Linear in the number of element blocks in *this[.](#hive.capacity-24.sentence-1)
|
||
|
||
If reallocation happens, also linear in the number of elements reallocated[.](#hive.capacity-24.sentence-2)
|
||
|
||
[25](#hive.capacity-25)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L8618)
|
||
|
||
*Remarks*: This operation may change capacity()[.](#hive.capacity-25.sentence-1)
|
||
|
||
If reallocation happens, the order of the elements in *this may change[.](#hive.capacity-25.sentence-2)
|
||
|
||
Reallocation invalidates all references, pointers, and iterators
|
||
referring to the elements in *this,
|
||
as well as the past-the-end iterator[.](#hive.capacity-25.sentence-3)
|
||
|
||
[*Note [2](#hive.capacity-note-2)*:
|
||
|
||
If no reallocation happens, they remain valid[.](#hive.capacity-25.sentence-4)
|
||
|
||
â *end note*]
|
||
|
||
#### [23.3.9.4](#hive.modifiers) Modifiers [[hive.modifiers]](hive.modifiers)
|
||
|
||
[ð](#lib:emplace,hive)
|
||
|
||
`template<class... Args> iterator emplace(Args&&... args);
|
||
template<class... Args> iterator emplace_hint(const_iterator hint, Args&&... args);
|
||
`
|
||
|
||
[1](#hive.modifiers-1)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L8639)
|
||
|
||
*Preconditions*: T is *Cpp17EmplaceConstructible* into hive from args[.](#hive.modifiers-1.sentence-1)
|
||
|
||
[2](#hive.modifiers-2)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L8643)
|
||
|
||
*Effects*: Inserts an object of type T constructed with std::forward<Args>(args)...[.](#hive.modifiers-2.sentence-1)
|
||
|
||
The hint parameter is ignored[.](#hive.modifiers-2.sentence-2)
|
||
|
||
If an exception is thrown, there are no effects[.](#hive.modifiers-2.sentence-3)
|
||
|
||
[*Note [1](#hive.modifiers-note-1)*:
|
||
|
||
args can directly or indirectly refer to a value in *this[.](#hive.modifiers-2.sentence-4)
|
||
|
||
â *end note*]
|
||
|
||
[3](#hive.modifiers-3)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L8653)
|
||
|
||
*Returns*: An iterator that points to the new element[.](#hive.modifiers-3.sentence-1)
|
||
|
||
[4](#hive.modifiers-4)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L8657)
|
||
|
||
*Complexity*: Constant[.](#hive.modifiers-4.sentence-1)
|
||
|
||
Exactly one object of type T is constructed[.](#hive.modifiers-4.sentence-2)
|
||
|
||
[5](#hive.modifiers-5)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L8661)
|
||
|
||
*Remarks*: Invalidates the past-the-end iterator[.](#hive.modifiers-5.sentence-1)
|
||
|
||
[ð](#lib:insert,hive)
|
||
|
||
`iterator insert(const T& x);
|
||
iterator insert(const_iterator hint, const T& x);
|
||
iterator insert(T&& x);
|
||
iterator insert(const_iterator hint, T&& x);
|
||
`
|
||
|
||
[6](#hive.modifiers-6)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L8675)
|
||
|
||
*Effects*: Equivalent to: return emplace(std::forward<decltype(x)>(x));
|
||
|
||
[*Note [2](#hive.modifiers-note-2)*:
|
||
|
||
The hint parameter is ignored[.](#hive.modifiers-6.sentence-1)
|
||
|
||
â *end note*]
|
||
|
||
[ð](#lib:insert,hive_)
|
||
|
||
`void insert(initializer_list<T> rg);
|
||
template<[container-compatible-range](container.intro.reqmts#concept:container-compatible-range "23.2.2.1 Introduction [container.intro.reqmts]")<T> R>
|
||
void insert_range(R&& rg);
|
||
`
|
||
|
||
[7](#hive.modifiers-7)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L8691)
|
||
|
||
*Preconditions*: T is *Cpp17EmplaceInsertable* into hive from *ranges::begin(rg)[.](#hive.modifiers-7.sentence-1)
|
||
|
||
rg and *this do not overlap[.](#hive.modifiers-7.sentence-2)
|
||
|
||
[8](#hive.modifiers-8)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L8697)
|
||
|
||
*Effects*: Inserts copies of elements in rg[.](#hive.modifiers-8.sentence-1)
|
||
|
||
Each iterator in the range rg is dereferenced exactly once[.](#hive.modifiers-8.sentence-2)
|
||
|
||
[9](#hive.modifiers-9)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L8702)
|
||
|
||
*Complexity*: Linear in the number of elements inserted[.](#hive.modifiers-9.sentence-1)
|
||
|
||
Exactly one object of type T is constructed for each element inserted[.](#hive.modifiers-9.sentence-2)
|
||
|
||
[10](#hive.modifiers-10)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L8707)
|
||
|
||
*Remarks*: If an element is inserted, invalidates the past-the-end iterator[.](#hive.modifiers-10.sentence-1)
|
||
|
||
[ð](#lib:insert,hive__)
|
||
|
||
`void insert(size_type n, const T& x);
|
||
`
|
||
|
||
[11](#hive.modifiers-11)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L8718)
|
||
|
||
*Preconditions*: T is *Cpp17CopyInsertable* into hive[.](#hive.modifiers-11.sentence-1)
|
||
|
||
[12](#hive.modifiers-12)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L8722)
|
||
|
||
*Effects*: Inserts n copies of x[.](#hive.modifiers-12.sentence-1)
|
||
|
||
[13](#hive.modifiers-13)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L8726)
|
||
|
||
*Complexity*: Linear in n[.](#hive.modifiers-13.sentence-1)
|
||
|
||
Exactly one object of type T is constructed for each element inserted[.](#hive.modifiers-13.sentence-2)
|
||
|
||
[14](#hive.modifiers-14)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L8731)
|
||
|
||
*Remarks*: If an element is inserted, invalidates the past-the-end iterator[.](#hive.modifiers-14.sentence-1)
|
||
|
||
[ð](#lib:insert,hive___)
|
||
|
||
`template<class InputIterator>
|
||
void insert(InputIterator first, InputIterator last);
|
||
`
|
||
|
||
[15](#hive.modifiers-15)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L8743)
|
||
|
||
*Effects*: Equivalent to insert_range(ranges::subrange(first, last))[.](#hive.modifiers-15.sentence-1)
|
||
|
||
[ð](#lib:erase,hive)
|
||
|
||
`iterator erase(const_iterator position);
|
||
iterator erase(const_iterator first, const_iterator last);
|
||
`
|
||
|
||
[16](#hive.modifiers-16)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L8755)
|
||
|
||
*Complexity*: Linear in the number of elements erased[.](#hive.modifiers-16.sentence-1)
|
||
|
||
Additionally, if any active blocks become empty of elements
|
||
as a result of the function call,
|
||
at worst linear in the number of element blocks[.](#hive.modifiers-16.sentence-2)
|
||
|
||
[17](#hive.modifiers-17)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L8762)
|
||
|
||
*Remarks*: Invalidates references, pointers and iterators
|
||
referring to the erased elements[.](#hive.modifiers-17.sentence-1)
|
||
|
||
An erase operation that erases the last element in *this also invalidates the past-the-end iterator[.](#hive.modifiers-17.sentence-2)
|
||
|
||
[ð](#lib:swap,hive)
|
||
|
||
`void swap(hive& x)
|
||
noexcept(allocator_traits<Allocator>::propagate_on_container_swap::value ||
|
||
allocator_traits<Allocator>::is_always_equal::value);
|
||
`
|
||
|
||
[18](#hive.modifiers-18)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L8778)
|
||
|
||
*Effects*: Exchanges the contents, capacity(), and *current-limits* of *this with that of x[.](#hive.modifiers-18.sentence-1)
|
||
|
||
[19](#hive.modifiers-19)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L8783)
|
||
|
||
*Complexity*: Constant[.](#hive.modifiers-19.sentence-1)
|
||
|
||
#### [23.3.9.5](#hive.operations) Operations [[hive.operations]](hive.operations)
|
||
|
||
[1](#hive.operations-1)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L8790)
|
||
|
||
In this subclause,
|
||
arguments for a template parameter
|
||
named Predicate or BinaryPredicate shall meet the corresponding requirements in [[algorithms.requirements]](algorithms.requirements "26.2 Algorithms requirements")[.](#hive.operations-1.sentence-1)
|
||
|
||
The semantics of i + n and i - n,
|
||
where i is an iterator into the hive and n is an integer,
|
||
are the same as those of next(i, n) and prev(i, n), respectively[.](#hive.operations-1.sentence-2)
|
||
|
||
For sort, the definitions and requirements in [[alg.sorting]](alg.sorting "26.8 Sorting and related operations") apply[.](#hive.operations-1.sentence-3)
|
||
|
||
[ð](#lib:splice,hive)
|
||
|
||
`void splice(hive& x);
|
||
void splice(hive&& x);
|
||
`
|
||
|
||
[2](#hive.operations-2)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L8807)
|
||
|
||
*Preconditions*: get_allocator() == x.get_allocator() is true[.](#hive.operations-2.sentence-1)
|
||
|
||
[3](#hive.operations-3)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L8811)
|
||
|
||
*Effects*: If addressof(x) == this is true,
|
||
the behavior is erroneous and there are no effects[.](#hive.operations-3.sentence-1)
|
||
|
||
Otherwise, inserts the contents of x into *this andx becomes empty[.](#hive.operations-3.sentence-2)
|
||
|
||
Pointers and references to the moved elements of x now refer to those same elements but as members of *this[.](#hive.operations-3.sentence-3)
|
||
|
||
Iterators referring to the moved elements continue to refer to their elements,
|
||
but they now behave as iterators into *this, not into x[.](#hive.operations-3.sentence-4)
|
||
|
||
[4](#hive.operations-4)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L8822)
|
||
|
||
*Throws*: length_error if any of x's active blocks
|
||
are not within the bounds of *current-limits*[.](#hive.operations-4.sentence-1)
|
||
|
||
[5](#hive.operations-5)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L8827)
|
||
|
||
*Complexity*: Linear in the sum of
|
||
all element blocks in x plus all element blocks in *this[.](#hive.operations-5.sentence-1)
|
||
|
||
[6](#hive.operations-6)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L8832)
|
||
|
||
*Remarks*: Reserved blocks in x are not transferred into *this[.](#hive.operations-6.sentence-1)
|
||
|
||
If addressof(x) == this is false,
|
||
invalidates the past-the-end iterator for both x and *this[.](#hive.operations-6.sentence-2)
|
||
|
||
[ð](#lib:unique,hive)
|
||
|
||
`template<class BinaryPredicate = equal_to<T>>
|
||
size_type unique(BinaryPredicate binary_pred = BinaryPredicate());
|
||
`
|
||
|
||
[7](#hive.operations-7)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L8846)
|
||
|
||
*Preconditions*: binary_pred is an equivalence relation[.](#hive.operations-7.sentence-1)
|
||
|
||
[8](#hive.operations-8)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L8850)
|
||
|
||
*Effects*: Erases all but the first element
|
||
from every consecutive group of equivalent elements[.](#hive.operations-8.sentence-1)
|
||
|
||
That is, for a nonempty hive,
|
||
erases all elements referred to by the iterator i in the range [begin() + 1, end())
|
||
for which binary_pred(*i, *(i - 1)) is true[.](#hive.operations-8.sentence-2)
|
||
|
||
[9](#hive.operations-9)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L8859)
|
||
|
||
*Returns*: The number of elements erased[.](#hive.operations-9.sentence-1)
|
||
|
||
[10](#hive.operations-10)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L8863)
|
||
|
||
*Throws*: Nothing unless an exception is thrown by the predicate[.](#hive.operations-10.sentence-1)
|
||
|
||
[11](#hive.operations-11)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L8867)
|
||
|
||
*Complexity*: If empty() is false,
|
||
exactly size() - 1 applications of the corresponding predicate,
|
||
otherwise no applications of the predicate[.](#hive.operations-11.sentence-1)
|
||
|
||
[12](#hive.operations-12)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L8873)
|
||
|
||
*Remarks*: Invalidates references, pointers, and iterators
|
||
referring to the erased elements[.](#hive.operations-12.sentence-1)
|
||
|
||
If the last element in *this is erased,
|
||
also invalidates the past-the-end iterator[.](#hive.operations-12.sentence-2)
|
||
|
||
[ð](#lib:sort,hive)
|
||
|
||
`template<class Compare = less<T>>
|
||
void sort(Compare comp = Compare());
|
||
`
|
||
|
||
[13](#hive.operations-13)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L8888)
|
||
|
||
*Preconditions*: T is *Cpp17MoveInsertable* into hive,*Cpp17MoveAssignable*, and *Cpp17Swappable*[.](#hive.operations-13.sentence-1)
|
||
|
||
[14](#hive.operations-14)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L8893)
|
||
|
||
*Effects*: Sorts *this according to the comp function object[.](#hive.operations-14.sentence-1)
|
||
|
||
If an exception is thrown,
|
||
the order of the elements in *this is unspecified[.](#hive.operations-14.sentence-2)
|
||
|
||
[15](#hive.operations-15)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L8899)
|
||
|
||
*Complexity*: O(NlogN) comparisons, where N is size()[.](#hive.operations-15.sentence-1)
|
||
|
||
[16](#hive.operations-16)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L8903)
|
||
|
||
*Remarks*: May allocate[.](#hive.operations-16.sentence-1)
|
||
|
||
References, pointers, and iterators referring to elements in *this,
|
||
as well as the past-the-end iterator, may be invalidated[.](#hive.operations-16.sentence-2)
|
||
|
||
[*Note [1](#hive.operations-note-1)*:
|
||
|
||
Not required to be stable[[algorithm.stable]](algorithm.stable "16.4.6.8 Requirements for stable algorithms")[.](#hive.operations-16.sentence-3)
|
||
|
||
â *end note*]
|
||
|
||
[ð](#lib:get_iterator,hive)
|
||
|
||
`iterator get_iterator(const_pointer p) noexcept;
|
||
const_iterator get_iterator(const_pointer p) const noexcept;
|
||
`
|
||
|
||
[17](#hive.operations-17)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L8920)
|
||
|
||
*Preconditions*: p points to an element in *this[.](#hive.operations-17.sentence-1)
|
||
|
||
[18](#hive.operations-18)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L8924)
|
||
|
||
*Returns*: An iterator or const_iterator pointing to the same element as p[.](#hive.operations-18.sentence-1)
|
||
|
||
[19](#hive.operations-19)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L8929)
|
||
|
||
*Complexity*: Linear in the number of active blocks in *this[.](#hive.operations-19.sentence-1)
|
||
|
||
#### [23.3.9.6](#hive.erasure) Erasure [[hive.erasure]](hive.erasure)
|
||
|
||
[ð](#lib:erase,hive_)
|
||
|
||
`template<class T, class Allocator, class U = T>
|
||
typename hive<T, Allocator>::size_type
|
||
erase(hive<T, Allocator>& c, const U& value);
|
||
`
|
||
|
||
[1](#hive.erasure-1)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L8944)
|
||
|
||
*Effects*: Equivalent to:return erase_if(c, [&](const auto& elem) -> bool { return elem == value; });
|
||
|
||
[ð](#lib:erase_if,hive)
|
||
|
||
`template<class T, class Allocator, class Predicate>
|
||
typename hive<T, Allocator>::size_type
|
||
erase_if(hive<T, Allocator>& c, Predicate pred);
|
||
`
|
||
|
||
[2](#hive.erasure-2)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L8960)
|
||
|
||
*Effects*: Equivalent to:auto original_size = c.size();for (auto i = c.begin(), last = c.end(); i != last; ) {if (pred(*i)) { i = c.erase(i); } else {++i; }}return original_size - c.size();
|
||
|
||
### [23.3.10](#list.syn) Header <list> synopsis [[list.syn]](list.syn)
|
||
|
||
[ð](#header:%3clist%3e)
|
||
|
||
#include <compare> // see [[compare.syn]](compare.syn "17.12.1 Header <compare> synopsis")#include <initializer_list> // see [[initializer.list.syn]](initializer.list.syn "17.11.2 Header <initializer_list> synopsis")namespace std {// [[list]](#list "23.3.11 Class template list"), class template listtemplate<class T, class Allocator = allocator<T>> class list; template<class T, class Allocator>constexpr bool operator==(const list<T, Allocator>& x, const list<T, Allocator>& y); template<class T, class Allocator>constexpr *synth-three-way-result*<T> operator<=>(const list<T, Allocator>& x, const list<T, Allocator>& y); template<class T, class Allocator>constexpr void swap(list<T, Allocator>& x, list<T, Allocator>& y)noexcept(noexcept(x.swap(y))); // [[list.erasure]](#list.erasure "23.3.11.6 Erasure"), erasuretemplate<class T, class Allocator, class U = T>constexpr typename list<T, Allocator>::size_type
|
||
erase(list<T, Allocator>& c, const U& value); template<class T, class Allocator, class Predicate>constexpr typename list<T, Allocator>::size_type
|
||
erase_if(list<T, Allocator>& c, Predicate pred); namespace pmr {template<class T>using list = std::list<T, polymorphic_allocator<T>>; }}
|
||
|
||
### [23.3.11](#list) Class template list [[list]](list)
|
||
|
||
#### [23.3.11.1](#list.overview) Overview [[list.overview]](list.overview)
|
||
|
||
[1](#list.overview-1)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L9016)
|
||
|
||
Alist is a sequence container that supports
|
||
bidirectional iterators and allows constant time insert and erase
|
||
operations anywhere within the sequence, with storage management handled
|
||
automatically[.](#list.overview-1.sentence-1)
|
||
|
||
Unlike [vectors](#vector "23.3.13 Class template vector [vector]") and [deques](#deque "23.3.5 Class template deque [deque]"),
|
||
fast random access to list elements is not supported, but many
|
||
algorithms only need sequential access anyway[.](#list.overview-1.sentence-2)
|
||
|
||
[2](#list.overview-2)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L9027)
|
||
|
||
A list meets all of the requirements
|
||
of a container ([[container.reqmts]](container.reqmts "23.2.2.2 Container requirements")),
|
||
of a reversible container ([[container.rev.reqmts]](container.rev.reqmts "23.2.2.3 Reversible container requirements")),
|
||
of an allocator-aware container ([[container.alloc.reqmts]](container.alloc.reqmts "23.2.2.5 Allocator-aware containers")), and
|
||
of a sequence container,
|
||
including most of the optional sequence container
|
||
requirements ([[sequence.reqmts]](sequence.reqmts "23.2.4 Sequence containers"))[.](#list.overview-2.sentence-1)
|
||
|
||
The exceptions are theoperator[] andat member functions, which are not provided[.](#list.overview-2.sentence-2)[195](#footnote-195 "These member functions are only provided by containers whose iterators are random access iterators.")
|
||
|
||
Descriptions are provided here only for operations onlist that are not described in one of these tables
|
||
or for operations where there is additional semantic information[.](#list.overview-2.sentence-3)
|
||
|
||
[3](#list.overview-3)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L9050)
|
||
|
||
The types iterator and const_iterator meet
|
||
the constexpr iterator requirements[[iterator.requirements.general]](iterator.requirements.general "24.3.1 General")[.](#list.overview-3.sentence-1)
|
||
|
||
namespace std {template<class T, class Allocator = allocator<T>>class list {public:// typesusing value_type = T; using allocator_type = Allocator; using pointer = typename allocator_traits<Allocator>::pointer; using const_pointer = typename allocator_traits<Allocator>::const_pointer; using reference = value_type&; using const_reference = const value_type&; using size_type = *implementation-defined*; // see [[container.requirements]](container.requirements "23.2 Requirements")using difference_type = *implementation-defined*; // see [[container.requirements]](container.requirements "23.2 Requirements")using iterator = *implementation-defined*; // see [[container.requirements]](container.requirements "23.2 Requirements")using const_iterator = *implementation-defined*; // see [[container.requirements]](container.requirements "23.2 Requirements")using reverse_iterator = std::reverse_iterator<iterator>; using const_reverse_iterator = std::reverse_iterator<const_iterator>; // [[list.cons]](#list.cons "23.3.11.2 Constructors, copy, and assignment"), construct/copy/destroyconstexpr list() : list(Allocator()) { }constexpr explicit list(const Allocator&); constexpr explicit list(size_type n, const Allocator& = Allocator()); constexpr list(size_type n, const T& value, const Allocator& = Allocator()); template<class InputIterator>constexpr list(InputIterator first, InputIterator last, const Allocator& = Allocator()); template<[*container-compatible-range*](container.intro.reqmts#concept:container-compatible-range "23.2.2.1 Introduction [container.intro.reqmts]")<T> R>constexpr list(from_range_t, R&& rg, const Allocator& = Allocator()); constexpr list(const list& x); constexpr list(list&& x); constexpr list(const list&, const type_identity_t<Allocator>&); constexpr list(list&&, const type_identity_t<Allocator>&); constexpr list(initializer_list<T>, const Allocator& = Allocator()); constexpr ~list(); constexpr list& operator=(const list& x); constexpr list& operator=(list&& x)noexcept(allocator_traits<Allocator>::is_always_equal::value); constexpr list& operator=(initializer_list<T>); template<class InputIterator>constexpr void assign(InputIterator first, InputIterator last); template<[*container-compatible-range*](container.intro.reqmts#concept:container-compatible-range "23.2.2.1 Introduction [container.intro.reqmts]")<T> R>constexpr void assign_range(R&& rg); constexpr void assign(size_type n, const T& t); constexpr void assign(initializer_list<T>); constexpr allocator_type get_allocator() const noexcept; // iteratorsconstexpr iterator begin() noexcept; constexpr const_iterator begin() const noexcept; constexpr iterator end() noexcept; constexpr const_iterator end() const noexcept; constexpr reverse_iterator rbegin() noexcept; constexpr const_reverse_iterator rbegin() const noexcept; constexpr reverse_iterator rend() noexcept; constexpr const_reverse_iterator rend() const noexcept; constexpr const_iterator cbegin() const noexcept; constexpr const_iterator cend() const noexcept; constexpr const_reverse_iterator crbegin() const noexcept; constexpr const_reverse_iterator crend() const noexcept; // [[list.capacity]](#list.capacity "23.3.11.3 Capacity"), capacityconstexpr bool empty() const noexcept; constexpr size_type size() const noexcept; constexpr size_type max_size() const noexcept; constexpr void resize(size_type sz); constexpr void resize(size_type sz, const T& c); // element accessconstexpr reference front(); constexpr const_reference front() const; constexpr reference back(); constexpr const_reference back() const; // [[list.modifiers]](#list.modifiers "23.3.11.4 Modifiers"), modifierstemplate<class... Args> constexpr reference emplace_front(Args&&... args); template<class... Args> constexpr reference emplace_back(Args&&... args); constexpr void push_front(const T& x); constexpr void push_front(T&& x); template<[*container-compatible-range*](container.intro.reqmts#concept:container-compatible-range "23.2.2.1 Introduction [container.intro.reqmts]")<T> R>constexpr void prepend_range(R&& rg); constexpr void pop_front(); constexpr void push_back(const T& x); constexpr void push_back(T&& x); template<[*container-compatible-range*](container.intro.reqmts#concept:container-compatible-range "23.2.2.1 Introduction [container.intro.reqmts]")<T> R>constexpr void append_range(R&& rg); constexpr void pop_back(); template<class... Args> constexpr iterator emplace(const_iterator position, Args&&... args); constexpr iterator insert(const_iterator position, const T& x); constexpr iterator insert(const_iterator position, T&& x); constexpr iterator insert(const_iterator position, size_type n, const T& x); template<class InputIterator>constexpr iterator insert(const_iterator position,
|
||
InputIterator first, InputIterator last); template<[*container-compatible-range*](container.intro.reqmts#concept:container-compatible-range "23.2.2.1 Introduction [container.intro.reqmts]")<T> R>constexpr iterator insert_range(const_iterator position, R&& rg); constexpr iterator insert(const_iterator position, initializer_list<T> il); constexpr iterator erase(const_iterator position); constexpr iterator erase(const_iterator position, const_iterator last); constexpr void swap(list&) noexcept(allocator_traits<Allocator>::is_always_equal::value); constexpr void clear() noexcept; // [[list.ops]](#list.ops "23.3.11.5 Operations"), list operationsconstexpr void splice(const_iterator position, list& x); constexpr void splice(const_iterator position, list&& x); constexpr void splice(const_iterator position, list& x, const_iterator i); constexpr void splice(const_iterator position, list&& x, const_iterator i); constexpr void splice(const_iterator position, list& x,
|
||
const_iterator first, const_iterator last); constexpr void splice(const_iterator position, list&& x,
|
||
const_iterator first, const_iterator last); constexpr size_type remove(const T& value); template<class Predicate> constexpr size_type remove_if(Predicate pred); constexpr size_type unique(); template<class BinaryPredicate>constexpr size_type unique(BinaryPredicate binary_pred); constexpr void merge(list& x); constexpr void merge(list&& x); template<class Compare> constexpr void merge(list& x, Compare comp); template<class Compare> constexpr void merge(list&& x, Compare comp); constexpr void sort(); template<class Compare> constexpr void sort(Compare comp); constexpr void reverse() noexcept; }; template<class InputIterator, class Allocator = allocator<*iter-value-type*<InputIterator>>> list(InputIterator, InputIterator, Allocator = Allocator())-> list<*iter-value-type*<InputIterator>, Allocator>; template<ranges::[input_range](range.refinements#concept:input_range "25.4.6 Other range refinements [range.refinements]") R, class Allocator = allocator<ranges::range_value_t<R>>> list(from_range_t, R&&, Allocator = Allocator())-> list<ranges::range_value_t<R>, Allocator>;}
|
||
|
||
[4](#list.overview-4)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L9196)
|
||
|
||
An incomplete type T may be used when instantiating list if the allocator meets the[allocator completeness requirements](allocator.requirements.completeness "16.4.4.6.2 Allocator completeness requirements [allocator.requirements.completeness]")[.](#list.overview-4.sentence-1)
|
||
|
||
T shall be complete before any member of the resulting specialization
|
||
of list is referenced[.](#list.overview-4.sentence-2)
|
||
|
||
[195)](#footnote-195)[195)](#footnoteref-195)
|
||
|
||
These member functions
|
||
are only provided by containers whose iterators
|
||
are random access iterators[.](#footnote-195.sentence-1)
|
||
|
||
#### [23.3.11.2](#list.cons) Constructors, copy, and assignment [[list.cons]](list.cons)
|
||
|
||
[ð](#lib:list,constructor)
|
||
|
||
`constexpr explicit list(const Allocator&);
|
||
`
|
||
|
||
[1](#list.cons-1)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L9211)
|
||
|
||
*Effects*: Constructs an empty list, using the specified allocator[.](#list.cons-1.sentence-1)
|
||
|
||
[2](#list.cons-2)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L9215)
|
||
|
||
*Complexity*: Constant[.](#list.cons-2.sentence-1)
|
||
|
||
[ð](#lib:list,constructor_)
|
||
|
||
`constexpr explicit list(size_type n, const Allocator& = Allocator());
|
||
`
|
||
|
||
[3](#list.cons-3)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L9226)
|
||
|
||
*Preconditions*: T is *Cpp17DefaultInsertable* into list[.](#list.cons-3.sentence-1)
|
||
|
||
[4](#list.cons-4)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L9230)
|
||
|
||
*Effects*: Constructs a list withn default-inserted elements using the specified allocator[.](#list.cons-4.sentence-1)
|
||
|
||
[5](#list.cons-5)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L9235)
|
||
|
||
*Complexity*: Linear inn[.](#list.cons-5.sentence-1)
|
||
|
||
[ð](#lib:list,constructor__)
|
||
|
||
`constexpr list(size_type n, const T& value, const Allocator& = Allocator());
|
||
`
|
||
|
||
[6](#list.cons-6)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L9247)
|
||
|
||
*Preconditions*: T is *Cpp17CopyInsertable* into list[.](#list.cons-6.sentence-1)
|
||
|
||
[7](#list.cons-7)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L9251)
|
||
|
||
*Effects*: Constructs alist withn copies ofvalue,
|
||
using the specified allocator[.](#list.cons-7.sentence-1)
|
||
|
||
[8](#list.cons-8)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L9261)
|
||
|
||
*Complexity*: Linear inn[.](#list.cons-8.sentence-1)
|
||
|
||
[ð](#lib:list,constructor___)
|
||
|
||
`template<class InputIterator>
|
||
constexpr list(InputIterator first, InputIterator last, const Allocator& = Allocator());
|
||
`
|
||
|
||
[9](#list.cons-9)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L9274)
|
||
|
||
*Effects*: Constructs alist equal to the range
|
||
[first, last)[.](#list.cons-9.sentence-1)
|
||
|
||
[10](#list.cons-10)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L9281)
|
||
|
||
*Complexity*: Linear indistance(first, last)[.](#list.cons-10.sentence-1)
|
||
|
||
[ð](#lib:list,constructor____)
|
||
|
||
`template<[container-compatible-range](container.intro.reqmts#concept:container-compatible-range "23.2.2.1 Introduction [container.intro.reqmts]")<T> R>
|
||
constexpr list(from_range_t, R&& rg, const Allocator& = Allocator());
|
||
`
|
||
|
||
[11](#list.cons-11)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L9294)
|
||
|
||
*Effects*: Constructs a list object with the elements of the range rg[.](#list.cons-11.sentence-1)
|
||
|
||
[12](#list.cons-12)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L9298)
|
||
|
||
*Complexity*: Linear in ranges::distance(rg)[.](#list.cons-12.sentence-1)
|
||
|
||
#### [23.3.11.3](#list.capacity) Capacity [[list.capacity]](list.capacity)
|
||
|
||
[ð](#lib:resize,list)
|
||
|
||
`constexpr void resize(size_type sz);
|
||
`
|
||
|
||
[1](#list.capacity-1)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L9311)
|
||
|
||
*Preconditions*: T is *Cpp17DefaultInsertable* into list[.](#list.capacity-1.sentence-1)
|
||
|
||
[2](#list.capacity-2)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L9315)
|
||
|
||
*Effects*: If size() < sz,
|
||
appends sz - size() default-inserted elements to the
|
||
sequence[.](#list.capacity-2.sentence-1)
|
||
|
||
If sz <= size(), equivalent to:list<T>::iterator it = begin();
|
||
advance(it, sz);
|
||
erase(it, end());
|
||
|
||
[ð](#lib:resize,list_)
|
||
|
||
`constexpr void resize(size_type sz, const T& c);
|
||
`
|
||
|
||
[3](#list.capacity-3)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L9334)
|
||
|
||
*Preconditions*: T is *Cpp17CopyInsertable* into list[.](#list.capacity-3.sentence-1)
|
||
|
||
[4](#list.capacity-4)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L9338)
|
||
|
||
*Effects*: As if by:if (sz > size()) insert(end(), sz-size(), c);else if (sz < size()) { iterator i = begin();
|
||
advance(i, sz);
|
||
erase(i, end());}else ; // do nothing
|
||
|
||
#### [23.3.11.4](#list.modifiers) Modifiers [[list.modifiers]](list.modifiers)
|
||
|
||
[ð](#lib:insert,list)
|
||
|
||
`constexpr iterator insert(const_iterator position, const T& x);
|
||
constexpr iterator insert(const_iterator position, T&& x);
|
||
constexpr iterator insert(const_iterator position, size_type n, const T& x);
|
||
template<class InputIterator>
|
||
constexpr iterator insert(const_iterator position,
|
||
InputIterator first, InputIterator last);
|
||
template<[container-compatible-range](container.intro.reqmts#concept:container-compatible-range "23.2.2.1 Introduction [container.intro.reqmts]")<T> R>
|
||
constexpr iterator insert_range(const_iterator position, R&& rg);
|
||
constexpr iterator insert(const_iterator position, initializer_list<T>);
|
||
|
||
template<class... Args> constexpr reference emplace_front(Args&&... args);
|
||
template<class... Args> constexpr reference emplace_back(Args&&... args);
|
||
template<class... Args> constexpr iterator emplace(const_iterator position, Args&&... args);
|
||
constexpr void push_front(const T& x);
|
||
constexpr void push_front(T&& x);
|
||
template<[container-compatible-range](container.intro.reqmts#concept:container-compatible-range "23.2.2.1 Introduction [container.intro.reqmts]")<T> R>
|
||
constexpr void prepend_range(R&& rg);
|
||
constexpr void push_back(const T& x);
|
||
constexpr void push_back(T&& x);
|
||
template<[container-compatible-range](container.intro.reqmts#concept:container-compatible-range "23.2.2.1 Introduction [container.intro.reqmts]")<T> R>
|
||
constexpr void append_range(R&& rg);
|
||
`
|
||
|
||
[1](#list.modifiers-1)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L9382)
|
||
|
||
*Complexity*: Insertion of a single element into a list takes constant time and
|
||
exactly one call to a constructor ofT[.](#list.modifiers-1.sentence-1)
|
||
|
||
Insertion of multiple elements into a list is linear in the
|
||
number of elements inserted, and the number of calls to the copy
|
||
constructor or move constructor of T is exactly equal
|
||
to the number of elements inserted[.](#list.modifiers-1.sentence-2)
|
||
|
||
[2](#list.modifiers-2)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L9391)
|
||
|
||
*Remarks*: Does not affect the validity of iterators and references[.](#list.modifiers-2.sentence-1)
|
||
|
||
If an exception is thrown, there are no effects[.](#list.modifiers-2.sentence-2)
|
||
|
||
[ð](#lib:erase,list)
|
||
|
||
`constexpr iterator erase(const_iterator position);
|
||
constexpr iterator erase(const_iterator first, const_iterator last);
|
||
constexpr void pop_front();
|
||
constexpr void pop_back();
|
||
constexpr void clear() noexcept;
|
||
`
|
||
|
||
[3](#list.modifiers-3)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L9407)
|
||
|
||
*Effects*: Invalidates only the iterators and references to the erased elements[.](#list.modifiers-3.sentence-1)
|
||
|
||
[4](#list.modifiers-4)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L9411)
|
||
|
||
*Throws*: Nothing[.](#list.modifiers-4.sentence-1)
|
||
|
||
[5](#list.modifiers-5)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L9415)
|
||
|
||
*Complexity*: Erasing a single element is a constant time operation with a single call to the destructor ofT[.](#list.modifiers-5.sentence-1)
|
||
|
||
Erasing a range in a list is linear time in the
|
||
size of the range and the number of calls to the destructor of typeT is exactly equal to the size of the range[.](#list.modifiers-5.sentence-2)
|
||
|
||
#### [23.3.11.5](#list.ops) Operations [[list.ops]](list.ops)
|
||
|
||
[1](#list.ops-1)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L9427)
|
||
|
||
Since lists allow fast insertion and erasing from the middle of a list, certain
|
||
operations are provided specifically for them[.](#list.ops-1.sentence-1)[196](#footnote-196 "As specified in [allocator.requirements], the requirements in this Clause apply only to lists whose allocators compare equal.")
|
||
|
||
In this subclause,
|
||
arguments for a template parameter
|
||
named Predicate or BinaryPredicate shall meet the corresponding requirements in [[algorithms.requirements]](algorithms.requirements "26.2 Algorithms requirements")[.](#list.ops-1.sentence-2)
|
||
|
||
The semantics of i + n and i - n,
|
||
where i is an iterator into the list and n is an integer,
|
||
are the same as those of next(i, n) and prev(i, n),
|
||
respectively[.](#list.ops-1.sentence-3)
|
||
|
||
For merge and sort,
|
||
the definitions and requirements in [[alg.sorting]](alg.sorting "26.8 Sorting and related operations") apply[.](#list.ops-1.sentence-4)
|
||
|
||
[2](#list.ops-2)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L9446)
|
||
|
||
list provides three splice operations that destructively move elements from one list to
|
||
another[.](#list.ops-2.sentence-1)
|
||
|
||
The behavior of splice operations is undefined if get_allocator() != x.get_allocator()[.](#list.ops-2.sentence-2)
|
||
|
||
[ð](#lib:splice,list)
|
||
|
||
`constexpr void splice(const_iterator position, list& x);
|
||
constexpr void splice(const_iterator position, list&& x);
|
||
`
|
||
|
||
[3](#list.ops-3)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L9458)
|
||
|
||
*Preconditions*: addressof(x) != this is true[.](#list.ops-3.sentence-1)
|
||
|
||
[4](#list.ops-4)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L9462)
|
||
|
||
*Effects*: Inserts the contents ofx beforeposition andx becomes empty[.](#list.ops-4.sentence-1)
|
||
|
||
Pointers and references to the moved elements ofx now refer to those same elements but as members of*this[.](#list.ops-4.sentence-2)
|
||
|
||
Iterators referring to the moved elements will continue to refer to their
|
||
elements, but they now behave as iterators into*this,
|
||
not intox[.](#list.ops-4.sentence-3)
|
||
|
||
[5](#list.ops-5)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L9481)
|
||
|
||
*Throws*: Nothing[.](#list.ops-5.sentence-1)
|
||
|
||
[6](#list.ops-6)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L9485)
|
||
|
||
*Complexity*: Constant time[.](#list.ops-6.sentence-1)
|
||
|
||
[ð](#lib:splice,list_)
|
||
|
||
`constexpr void splice(const_iterator position, list& x, const_iterator i);
|
||
constexpr void splice(const_iterator position, list&& x, const_iterator i);
|
||
`
|
||
|
||
[7](#list.ops-7)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L9497)
|
||
|
||
*Preconditions*: i is a valid dereferenceable iterator of x[.](#list.ops-7.sentence-1)
|
||
|
||
[8](#list.ops-8)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L9501)
|
||
|
||
*Effects*: Inserts an element pointed to byi from listx before position and removes the element fromx[.](#list.ops-8.sentence-1)
|
||
|
||
The result is unchanged ifposition == i orposition == ++i[.](#list.ops-8.sentence-2)
|
||
|
||
Pointers and references to*i continue to refer to this same element but as a member of*this[.](#list.ops-8.sentence-3)
|
||
|
||
Iterators
|
||
to*i (includingi itself) continue to refer to the same element, but now behave as iterators into*this,
|
||
not intox[.](#list.ops-8.sentence-4)
|
||
|
||
[9](#list.ops-9)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L9527)
|
||
|
||
*Throws*: Nothing[.](#list.ops-9.sentence-1)
|
||
|
||
[10](#list.ops-10)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L9531)
|
||
|
||
*Complexity*: Constant time[.](#list.ops-10.sentence-1)
|
||
|
||
[ð](#lib:splice,list__)
|
||
|
||
`constexpr void splice(const_iterator position, list& x,
|
||
const_iterator first, const_iterator last);
|
||
constexpr void splice(const_iterator position, list&& x,
|
||
const_iterator first, const_iterator last);
|
||
`
|
||
|
||
[11](#list.ops-11)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L9545)
|
||
|
||
*Preconditions*: [first, last) is a valid range in x[.](#list.ops-11.sentence-1)
|
||
|
||
position is not an iterator in the range [first, last)[.](#list.ops-11.sentence-2)
|
||
|
||
[12](#list.ops-12)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L9550)
|
||
|
||
*Effects*: Inserts elements in the range
|
||
[first, last)
|
||
beforeposition and removes the elements fromx[.](#list.ops-12.sentence-1)
|
||
|
||
Pointers and references to the moved elements ofx now refer to those same elements but as members of*this[.](#list.ops-12.sentence-2)
|
||
|
||
Iterators referring to the moved elements will continue to refer to their
|
||
elements, but they now behave as iterators into*this,
|
||
not intox[.](#list.ops-12.sentence-3)
|
||
|
||
[13](#list.ops-13)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L9568)
|
||
|
||
*Throws*: Nothing[.](#list.ops-13.sentence-1)
|
||
|
||
[14](#list.ops-14)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L9572)
|
||
|
||
*Complexity*: Constant time ifaddressof(x) == this;
|
||
otherwise, linear time[.](#list.ops-14.sentence-1)
|
||
|
||
[ð](#lib:remove,list)
|
||
|
||
`constexpr size_type remove(const T& value);
|
||
template<class Predicate> constexpr size_type remove_if(Predicate pred);
|
||
`
|
||
|
||
[15](#list.ops-15)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L9586)
|
||
|
||
*Effects*: Erases all the elements in the list referred to by a list iterator i for which the
|
||
following conditions hold: *i == value, pred(*i) != false[.](#list.ops-15.sentence-1)
|
||
|
||
Invalidates only the iterators and references to the erased elements[.](#list.ops-15.sentence-2)
|
||
|
||
[16](#list.ops-16)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L9592)
|
||
|
||
*Returns*: The number of elements erased[.](#list.ops-16.sentence-1)
|
||
|
||
[17](#list.ops-17)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L9596)
|
||
|
||
*Throws*: Nothing unless an exception is thrown by*i == value orpred(*i) != false[.](#list.ops-17.sentence-1)
|
||
|
||
[18](#list.ops-18)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L9603)
|
||
|
||
*Complexity*: Exactlysize() applications of the corresponding predicate[.](#list.ops-18.sentence-1)
|
||
|
||
[19](#list.ops-19)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L9609)
|
||
|
||
*Remarks*: [Stable](algorithm.stable "16.4.6.8 Requirements for stable algorithms [algorithm.stable]")[.](#list.ops-19.sentence-1)
|
||
|
||
[ð](#lib:unique,list)
|
||
|
||
`constexpr size_type unique();
|
||
template<class BinaryPredicate> constexpr size_type unique(BinaryPredicate binary_pred);
|
||
`
|
||
|
||
[20](#list.ops-20)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L9621)
|
||
|
||
Let binary_pred be equal_to<>{} for the first overload[.](#list.ops-20.sentence-1)
|
||
|
||
[21](#list.ops-21)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L9624)
|
||
|
||
*Preconditions*: binary_pred is an equivalence relation[.](#list.ops-21.sentence-1)
|
||
|
||
[22](#list.ops-22)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L9628)
|
||
|
||
*Effects*: Erases all but the first element from every
|
||
consecutive group of equivalent elements[.](#list.ops-22.sentence-1)
|
||
|
||
That is, for a nonempty list, erases all elements referred to
|
||
by the iterator i in the range [begin() + 1, end())
|
||
for which binary_pred(*i, *(i - 1)) is true[.](#list.ops-22.sentence-2)
|
||
|
||
Invalidates only the iterators and references to the erased elements[.](#list.ops-22.sentence-3)
|
||
|
||
[23](#list.ops-23)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L9637)
|
||
|
||
*Returns*: The number of elements erased[.](#list.ops-23.sentence-1)
|
||
|
||
[24](#list.ops-24)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L9641)
|
||
|
||
*Throws*: Nothing unless an exception is thrown by the predicate[.](#list.ops-24.sentence-1)
|
||
|
||
[25](#list.ops-25)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L9645)
|
||
|
||
*Complexity*: If empty() is false,
|
||
exactly size() - 1 applications of the corresponding predicate,
|
||
otherwise no applications of the predicate[.](#list.ops-25.sentence-1)
|
||
|
||
[ð](#lib:merge,list)
|
||
|
||
`constexpr void merge(list& x);
|
||
constexpr void merge(list&& x);
|
||
template<class Compare> constexpr void merge(list& x, Compare comp);
|
||
template<class Compare> constexpr void merge(list&& x, Compare comp);
|
||
`
|
||
|
||
[26](#list.ops-26)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L9661)
|
||
|
||
Let comp be less<> for the first two overloads[.](#list.ops-26.sentence-1)
|
||
|
||
[27](#list.ops-27)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L9664)
|
||
|
||
*Preconditions*: *this and x are both sorted
|
||
with respect to the comparator comp, andget_allocator() == x.get_allocator() is true[.](#list.ops-27.sentence-1)
|
||
|
||
[28](#list.ops-28)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L9670)
|
||
|
||
*Effects*: If addressof(x) == this, there are no effects[.](#list.ops-28.sentence-1)
|
||
|
||
Otherwise, merges
|
||
the two sorted ranges [begin(), end()) and [x.begin(), x.end())[.](#list.ops-28.sentence-2)
|
||
|
||
The result is a range
|
||
that is sorted with respect to the comparator comp[.](#list.ops-28.sentence-3)
|
||
|
||
Pointers and references to the moved elements of x now refer to those same elements
|
||
but as members of *this[.](#list.ops-28.sentence-4)
|
||
|
||
Iterators referring to the moved elements will continue to
|
||
refer to their elements, but they now behave as iterators into *this, not intox[.](#list.ops-28.sentence-5)
|
||
|
||
[29](#list.ops-29)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L9682)
|
||
|
||
*Complexity*: At most size() + x.size() - 1 comparisons
|
||
if addressof(x) != this;
|
||
otherwise, no comparisons are performed[.](#list.ops-29.sentence-1)
|
||
|
||
[30](#list.ops-30)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L9688)
|
||
|
||
*Remarks*: Stable ([[algorithm.stable]](algorithm.stable "16.4.6.8 Requirements for stable algorithms"))[.](#list.ops-30.sentence-1)
|
||
|
||
If addressof(x) != this, x is empty after the merge[.](#list.ops-30.sentence-2)
|
||
|
||
No elements are copied by this operation[.](#list.ops-30.sentence-3)
|
||
|
||
If an exception is thrown other than by a comparison, there are no effects[.](#list.ops-30.sentence-4)
|
||
|
||
[ð](#lib:reverse,list)
|
||
|
||
`constexpr void reverse() noexcept;
|
||
`
|
||
|
||
[31](#list.ops-31)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L9702)
|
||
|
||
*Effects*: Reverses the order of the elements in the list[.](#list.ops-31.sentence-1)
|
||
|
||
Does not affect the validity of iterators and references[.](#list.ops-31.sentence-2)
|
||
|
||
[32](#list.ops-32)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L9707)
|
||
|
||
*Complexity*: Linear time[.](#list.ops-32.sentence-1)
|
||
|
||
[ð](#lib:sort,list)
|
||
|
||
`void sort();
|
||
template<class Compare> void sort(Compare comp);
|
||
`
|
||
|
||
[33](#list.ops-33)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L9719)
|
||
|
||
*Effects*: Sorts the list according to the operator< or a Compare function object[.](#list.ops-33.sentence-1)
|
||
|
||
If an exception is thrown,
|
||
the order of the elements in *this is unspecified[.](#list.ops-33.sentence-2)
|
||
|
||
Does not affect the validity of iterators and references[.](#list.ops-33.sentence-3)
|
||
|
||
[34](#list.ops-34)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L9726)
|
||
|
||
*Complexity*: ApproximatelyNlogN comparisons, where N is size()[.](#list.ops-34.sentence-1)
|
||
|
||
[35](#list.ops-35)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L9732)
|
||
|
||
*Remarks*: [Stable](algorithm.stable "16.4.6.8 Requirements for stable algorithms [algorithm.stable]")[.](#list.ops-35.sentence-1)
|
||
|
||
[196)](#footnote-196)[196)](#footnoteref-196)
|
||
|
||
As specified
|
||
in [[allocator.requirements]](allocator.requirements "16.4.4.6 Cpp17Allocator requirements"), the requirements in this Clause apply only to
|
||
lists whose allocators compare equal[.](#footnote-196.sentence-1)
|
||
|
||
#### [23.3.11.6](#list.erasure) Erasure [[list.erasure]](list.erasure)
|
||
|
||
[ð](#lib:erase,list_)
|
||
|
||
`template<class T, class Allocator, class U = T>
|
||
typename list<T, Allocator>::size_type
|
||
constexpr erase(list<T, Allocator>& c, const U& value);
|
||
`
|
||
|
||
[1](#list.erasure-1)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L9747)
|
||
|
||
*Effects*: Equivalent to:return erase_if(c, [&](const auto& elem) -> bool { return elem == value; });
|
||
|
||
[ð](#lib:erase_if,list)
|
||
|
||
`template<class T, class Allocator, class Predicate>
|
||
typename list<T, Allocator>::size_type
|
||
constexpr erase_if(list<T, Allocator>& c, Predicate pred);
|
||
`
|
||
|
||
[2](#list.erasure-2)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L9763)
|
||
|
||
*Effects*: Equivalent to: return c.remove_if(pred);
|
||
|
||
### [23.3.12](#vector.syn) Header <vector> synopsis [[vector.syn]](vector.syn)
|
||
|
||
[ð](#header:%3cvector%3e)
|
||
|
||
#include <compare> // see [[compare.syn]](compare.syn "17.12.1 Header <compare> synopsis")#include <initializer_list> // see [[initializer.list.syn]](initializer.list.syn "17.11.2 Header <initializer_list> synopsis")namespace std {// [[vector]](#vector "23.3.13 Class template vector"), class template vectortemplate<class T, class Allocator = allocator<T>> class vector; template<class T, class Allocator>constexpr bool operator==(const vector<T, Allocator>& x, const vector<T, Allocator>& y); template<class T, class Allocator>constexpr *synth-three-way-result*<T> operator<=>(const vector<T, Allocator>& x, const vector<T, Allocator>& y); template<class T, class Allocator>constexpr void swap(vector<T, Allocator>& x, vector<T, Allocator>& y)noexcept(noexcept(x.swap(y))); // [[vector.erasure]](#vector.erasure "23.3.13.6 Erasure"), erasuretemplate<class T, class Allocator, class U = T>constexpr typename vector<T, Allocator>::size_type
|
||
erase(vector<T, Allocator>& c, const U& value); template<class T, class Allocator, class Predicate>constexpr typename vector<T, Allocator>::size_type
|
||
erase_if(vector<T, Allocator>& c, Predicate pred); namespace pmr {template<class T>using vector = std::vector<T, polymorphic_allocator<T>>; }// [[vector.bool]](#vector.bool "23.3.14 Specialization of vector for bool"), specialization of vector for bool// [[vector.bool.pspc]](#vector.bool.pspc "23.3.14.1 Partial class template specialization vector<bool, Allocator>"), partial class template specialization vector<bool, Allocator>template<class Allocator>class vector<bool, Allocator>; template<class T>constexpr bool *is-vector-bool-reference* = *see below*; // *exposition only*// hash supporttemplate<class T> struct hash; template<class Allocator> struct hash<vector<bool, Allocator>>; // [[vector.bool.fmt]](#vector.bool.fmt "23.3.14.2 Formatter specialization for vector<bool>"), formatter specialization for vector<bool>template<class T, class charT> requires *is-vector-bool-reference*<T>struct formatter<T, charT>;}
|
||
|
||
### [23.3.13](#vector) Class template vector [[vector]](vector)
|
||
|
||
#### [23.3.13.1](#vector.overview) Overview [[vector.overview]](vector.overview)
|
||
|
||
[1](#vector.overview-1)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L9824)
|
||
|
||
Avector is a sequence container that supports
|
||
(amortized) constant time insert and erase operations at the end;
|
||
insert and erase in the middle take linear time[.](#vector.overview-1.sentence-1)
|
||
|
||
Storage management is handled automatically, though hints can be given
|
||
to improve efficiency[.](#vector.overview-1.sentence-2)
|
||
|
||
[2](#vector.overview-2)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L9834)
|
||
|
||
A vector meets all of the requirements
|
||
of a container ([[container.reqmts]](container.reqmts "23.2.2.2 Container requirements")),
|
||
of a reversible container ([[container.rev.reqmts]](container.rev.reqmts "23.2.2.3 Reversible container requirements")),
|
||
of an allocator-aware container ([[container.alloc.reqmts]](container.alloc.reqmts "23.2.2.5 Allocator-aware containers")),
|
||
of a sequence container, including most of the optional sequence container
|
||
requirements ([[sequence.reqmts]](sequence.reqmts "23.2.4 Sequence containers")),
|
||
and, for an element type other than bool,
|
||
of a [contiguous container](container.reqmts#def:container,contiguous "23.2.2.2 Container requirements [container.reqmts]")[.](#vector.overview-2.sentence-1)
|
||
|
||
The exceptions are thepush_front, prepend_range, pop_front, and emplace_front member functions, which are not
|
||
provided[.](#vector.overview-2.sentence-2)
|
||
|
||
Descriptions are provided here only for operations on vector that are not described in one of these tables or for operations where there is
|
||
additional semantic information[.](#vector.overview-2.sentence-3)
|
||
|
||
[3](#vector.overview-3)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L9849)
|
||
|
||
The types iterator and const_iterator meet
|
||
the constexpr iterator requirements ([[iterator.requirements.general]](iterator.requirements.general "24.3.1 General"))[.](#vector.overview-3.sentence-1)
|
||
|
||
namespace std {template<class T, class Allocator = allocator<T>>class vector {public:// typesusing value_type = T; using allocator_type = Allocator; using pointer = typename allocator_traits<Allocator>::pointer; using const_pointer = typename allocator_traits<Allocator>::const_pointer; using reference = value_type&; using const_reference = const value_type&; using size_type = *implementation-defined*; // see [[container.requirements]](container.requirements "23.2 Requirements")using difference_type = *implementation-defined*; // see [[container.requirements]](container.requirements "23.2 Requirements")using iterator = *implementation-defined*; // see [[container.requirements]](container.requirements "23.2 Requirements")using const_iterator = *implementation-defined*; // see [[container.requirements]](container.requirements "23.2 Requirements")using reverse_iterator = std::reverse_iterator<iterator>; using const_reverse_iterator = std::reverse_iterator<const_iterator>; // [[vector.cons]](#vector.cons "23.3.13.2 Constructors"), construct/copy/destroyconstexpr vector() noexcept(noexcept(Allocator())) : vector(Allocator()) { }constexpr explicit vector(const Allocator&) noexcept; constexpr explicit vector(size_type n, const Allocator& = Allocator()); constexpr vector(size_type n, const T& value, const Allocator& = Allocator()); template<class InputIterator>constexpr vector(InputIterator first, InputIterator last, const Allocator& = Allocator()); template<[*container-compatible-range*](container.intro.reqmts#concept:container-compatible-range "23.2.2.1 Introduction [container.intro.reqmts]")<T> R>constexpr vector(from_range_t, R&& rg, const Allocator& = Allocator()); constexpr vector(const vector& x); constexpr vector(vector&&) noexcept; constexpr vector(const vector&, const type_identity_t<Allocator>&); constexpr vector(vector&&, const type_identity_t<Allocator>&); constexpr vector(initializer_list<T>, const Allocator& = Allocator()); constexpr ~vector(); constexpr vector& operator=(const vector& x); constexpr vector& operator=(vector&& x)noexcept(allocator_traits<Allocator>::propagate_on_container_move_assignment::value || allocator_traits<Allocator>::is_always_equal::value); constexpr vector& operator=(initializer_list<T>); template<class InputIterator>constexpr void assign(InputIterator first, InputIterator last); template<[*container-compatible-range*](container.intro.reqmts#concept:container-compatible-range "23.2.2.1 Introduction [container.intro.reqmts]")<T> R>constexpr void assign_range(R&& rg); constexpr void assign(size_type n, const T& u); constexpr void assign(initializer_list<T>); constexpr allocator_type get_allocator() const noexcept; // iteratorsconstexpr iterator begin() noexcept; constexpr const_iterator begin() const noexcept; constexpr iterator end() noexcept; constexpr const_iterator end() const noexcept; constexpr reverse_iterator rbegin() noexcept; constexpr const_reverse_iterator rbegin() const noexcept; constexpr reverse_iterator rend() noexcept; constexpr const_reverse_iterator rend() const noexcept; constexpr const_iterator cbegin() const noexcept; constexpr const_iterator cend() const noexcept; constexpr const_reverse_iterator crbegin() const noexcept; constexpr const_reverse_iterator crend() const noexcept; // [[vector.capacity]](#vector.capacity "23.3.13.3 Capacity"), capacityconstexpr bool empty() const noexcept; constexpr size_type size() const noexcept; constexpr size_type max_size() const noexcept; constexpr size_type capacity() const noexcept; constexpr void resize(size_type sz); constexpr void resize(size_type sz, const T& c); constexpr void reserve(size_type n); constexpr void shrink_to_fit(); // element accessconstexpr reference operator[](size_type n); constexpr const_reference operator[](size_type n) const; constexpr reference at(size_type n); constexpr const_reference at(size_type n) const; constexpr reference front(); constexpr const_reference front() const; constexpr reference back(); constexpr const_reference back() const; // [[vector.data]](#vector.data "23.3.13.4 Data"), data accessconstexpr T* data() noexcept; constexpr const T* data() const noexcept; // [[vector.modifiers]](#vector.modifiers "23.3.13.5 Modifiers"), modifierstemplate<class... Args> constexpr reference emplace_back(Args&&... args); constexpr void push_back(const T& x); constexpr void push_back(T&& x); template<[*container-compatible-range*](container.intro.reqmts#concept:container-compatible-range "23.2.2.1 Introduction [container.intro.reqmts]")<T> R>constexpr void append_range(R&& rg); constexpr void pop_back(); template<class... Args> constexpr iterator emplace(const_iterator position, Args&&... args); constexpr iterator insert(const_iterator position, const T& x); constexpr iterator insert(const_iterator position, T&& x); constexpr iterator insert(const_iterator position, size_type n, const T& x); template<class InputIterator>constexpr iterator insert(const_iterator position,
|
||
InputIterator first, InputIterator last); template<[*container-compatible-range*](container.intro.reqmts#concept:container-compatible-range "23.2.2.1 Introduction [container.intro.reqmts]")<T> R>constexpr iterator insert_range(const_iterator position, R&& rg); constexpr iterator insert(const_iterator position, initializer_list<T> il); constexpr iterator erase(const_iterator position); constexpr iterator erase(const_iterator first, const_iterator last); constexpr void swap(vector&)noexcept(allocator_traits<Allocator>::propagate_on_container_swap::value || allocator_traits<Allocator>::is_always_equal::value); constexpr void clear() noexcept; }; template<class InputIterator, class Allocator = allocator<*iter-value-type*<InputIterator>>> vector(InputIterator, InputIterator, Allocator = Allocator())-> vector<*iter-value-type*<InputIterator>, Allocator>; template<ranges::[input_range](range.refinements#concept:input_range "25.4.6 Other range refinements [range.refinements]") R, class Allocator = allocator<ranges::range_value_t<R>>> vector(from_range_t, R&&, Allocator = Allocator())-> vector<ranges::range_value_t<R>, Allocator>;}
|
||
|
||
[4](#vector.overview-4)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L9977)
|
||
|
||
An incomplete type T may be used when instantiating vector if the allocator meets the[allocator completeness requirements](allocator.requirements.completeness "16.4.4.6.2 Allocator completeness requirements [allocator.requirements.completeness]")[.](#vector.overview-4.sentence-1)
|
||
|
||
T shall be complete before any member of the resulting specialization
|
||
of vector is referenced[.](#vector.overview-4.sentence-2)
|
||
|
||
#### [23.3.13.2](#vector.cons) Constructors [[vector.cons]](vector.cons)
|
||
|
||
[ð](#lib:vector,constructor)
|
||
|
||
`constexpr explicit vector(const Allocator&) noexcept;
|
||
`
|
||
|
||
[1](#vector.cons-1)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L9992)
|
||
|
||
*Effects*: Constructs an empty vector, using the
|
||
specified allocator[.](#vector.cons-1.sentence-1)
|
||
|
||
[2](#vector.cons-2)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L9997)
|
||
|
||
*Complexity*: Constant[.](#vector.cons-2.sentence-1)
|
||
|
||
[ð](#lib:vector,constructor_)
|
||
|
||
`constexpr explicit vector(size_type n, const Allocator& = Allocator());
|
||
`
|
||
|
||
[3](#vector.cons-3)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L10008)
|
||
|
||
*Preconditions*: T is *Cpp17DefaultInsertable* into vector[.](#vector.cons-3.sentence-1)
|
||
|
||
[4](#vector.cons-4)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L10012)
|
||
|
||
*Effects*: Constructs a vector with n default-inserted elements using the specified allocator[.](#vector.cons-4.sentence-1)
|
||
|
||
[5](#vector.cons-5)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L10017)
|
||
|
||
*Complexity*: Linear in n[.](#vector.cons-5.sentence-1)
|
||
|
||
[ð](#lib:vector,constructor__)
|
||
|
||
`constexpr vector(size_type n, const T& value,
|
||
const Allocator& = Allocator());
|
||
`
|
||
|
||
[6](#vector.cons-6)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L10029)
|
||
|
||
*Preconditions*: T is*Cpp17CopyInsertable* into vector[.](#vector.cons-6.sentence-1)
|
||
|
||
[7](#vector.cons-7)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L10034)
|
||
|
||
*Effects*: Constructs a vector with n copies of value, using the specified allocator[.](#vector.cons-7.sentence-1)
|
||
|
||
[8](#vector.cons-8)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L10039)
|
||
|
||
*Complexity*: Linear in n[.](#vector.cons-8.sentence-1)
|
||
|
||
[ð](#lib:vector,constructor___)
|
||
|
||
`template<class InputIterator>
|
||
constexpr vector(InputIterator first, InputIterator last,
|
||
const Allocator& = Allocator());
|
||
`
|
||
|
||
[9](#vector.cons-9)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L10052)
|
||
|
||
*Effects*: Constructs a vector equal to the
|
||
range [first, last), using the specified allocator[.](#vector.cons-9.sentence-1)
|
||
|
||
[10](#vector.cons-10)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L10057)
|
||
|
||
*Complexity*: Makes only N calls to the copy constructor ofT (where N is the distance betweenfirst andlast)
|
||
and no reallocations ifInputIterator meets the *Cpp17ForwardIterator* requirements[.](#vector.cons-10.sentence-1)
|
||
|
||
It makes orderN calls to the copy constructor ofT and orderlogN reallocations if they are just input iterators[.](#vector.cons-10.sentence-2)
|
||
|
||
[ð](#lib:vector,constructor____)
|
||
|
||
`template<[container-compatible-range](container.intro.reqmts#concept:container-compatible-range "23.2.2.1 Introduction [container.intro.reqmts]")<T> R>
|
||
constexpr vector(from_range_t, R&& rg, const Allocator& = Allocator());
|
||
`
|
||
|
||
[11](#vector.cons-11)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L10085)
|
||
|
||
*Effects*: Constructs a vector object with the elements of the range rg,
|
||
using the specified allocator[.](#vector.cons-11.sentence-1)
|
||
|
||
[12](#vector.cons-12)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L10090)
|
||
|
||
*Complexity*: Initializes exactly N elements
|
||
from the results of dereferencing successive iterators of rg,
|
||
where N is ranges::distance(rg)[.](#vector.cons-12.sentence-1)
|
||
|
||
[13](#vector.cons-13)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L10096)
|
||
|
||
Performs no reallocations if:
|
||
|
||
- [(13.1)](#vector.cons-13.1)
|
||
|
||
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, or
|
||
|
||
- [(13.2)](#vector.cons-13.2)
|
||
|
||
R models ranges::[forward_range](range.refinements#concept:forward_range "25.4.6 Other range refinements [range.refinements]") andR does not model ranges::[approximately_sized_range](range.approximately.sized#concept:approximately_sized_range "25.4.3 Approximately sized ranges [range.approximately.sized]")[.](#vector.cons-13.sentence-1)
|
||
|
||
Otherwise, performs order logN reallocations and
|
||
order N calls to the copy or move constructor of T[.](#vector.cons-13.sentence-2)
|
||
|
||
#### [23.3.13.3](#vector.capacity) Capacity [[vector.capacity]](vector.capacity)
|
||
|
||
[ð](#lib:capacity,vector)
|
||
|
||
`constexpr size_type capacity() const noexcept;
|
||
`
|
||
|
||
[1](#vector.capacity-1)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L10118)
|
||
|
||
*Returns*: The total number of elements that the vector can hold
|
||
without requiring reallocation[.](#vector.capacity-1.sentence-1)
|
||
|
||
[2](#vector.capacity-2)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L10123)
|
||
|
||
*Complexity*: Constant time[.](#vector.capacity-2.sentence-1)
|
||
|
||
[ð](#lib:reserve,vector)
|
||
|
||
`constexpr void reserve(size_type n);
|
||
`
|
||
|
||
[3](#vector.capacity-3)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L10134)
|
||
|
||
*Preconditions*: T is *Cpp17MoveInsertable* into vector[.](#vector.capacity-3.sentence-1)
|
||
|
||
[4](#vector.capacity-4)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L10138)
|
||
|
||
*Effects*: A directive that informs avector of a planned change in size, so that it can manage the storage allocation accordingly[.](#vector.capacity-4.sentence-1)
|
||
|
||
Afterreserve(),capacity() is greater or equal to the argument ofreserve if reallocation happens; and equal to the previous value ofcapacity() otherwise[.](#vector.capacity-4.sentence-2)
|
||
|
||
Reallocation happens at this point if and only if the current capacity is less than the
|
||
argument ofreserve()[.](#vector.capacity-4.sentence-3)
|
||
|
||
If an exception is thrown
|
||
other than by the move constructor of a non-*Cpp17CopyInsertable* type,
|
||
there are no effects[.](#vector.capacity-4.sentence-4)
|
||
|
||
[5](#vector.capacity-5)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L10157)
|
||
|
||
*Throws*: length_error if n > max_size()[.](#vector.capacity-5.sentence-1)[197](#footnote-197 "reserve() uses Allocator::allocate() which can throw an appropriate exception.")
|
||
|
||
[6](#vector.capacity-6)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L10166)
|
||
|
||
*Complexity*: It does not change the size of the sequence and takes at most linear
|
||
time in the size of the sequence[.](#vector.capacity-6.sentence-1)
|
||
|
||
[7](#vector.capacity-7)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L10171)
|
||
|
||
*Remarks*: Reallocation invalidates all the references, pointers, and iterators
|
||
referring to the elements in the sequence, as well as the past-the-end iterator[.](#vector.capacity-7.sentence-1)
|
||
|
||
[*Note [1](#vector.capacity-note-1)*:
|
||
|
||
If no reallocation happens, they remain valid[.](#vector.capacity-7.sentence-2)
|
||
|
||
â *end note*]
|
||
|
||
No reallocation shall take place during insertions that happen
|
||
after a call to reserve() until an insertion would make the size of the vector
|
||
greater than the value of capacity()[.](#vector.capacity-7.sentence-3)
|
||
|
||
[ð](#lib:shrink_to_fit,vector)
|
||
|
||
`constexpr void shrink_to_fit();
|
||
`
|
||
|
||
[8](#vector.capacity-8)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L10190)
|
||
|
||
*Preconditions*: T is *Cpp17MoveInsertable* into vector[.](#vector.capacity-8.sentence-1)
|
||
|
||
[9](#vector.capacity-9)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L10194)
|
||
|
||
*Effects*: shrink_to_fit is a non-binding request to reducecapacity() to size()[.](#vector.capacity-9.sentence-1)
|
||
|
||
[*Note [2](#vector.capacity-note-2)*:
|
||
|
||
The request is non-binding to allow latitude for
|
||
implementation-specific optimizations[.](#vector.capacity-9.sentence-2)
|
||
|
||
â *end note*]
|
||
|
||
It does not increase capacity(), but may reduce capacity() by causing reallocation[.](#vector.capacity-9.sentence-3)
|
||
|
||
If an exception is thrown other than by the move constructor
|
||
of a non-*Cpp17CopyInsertable* T, there are no effects[.](#vector.capacity-9.sentence-4)
|
||
|
||
[10](#vector.capacity-10)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L10207)
|
||
|
||
*Complexity*: If reallocation happens,
|
||
linear in the size of the sequence[.](#vector.capacity-10.sentence-1)
|
||
|
||
[11](#vector.capacity-11)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L10212)
|
||
|
||
*Remarks*: Reallocation invalidates all the references, pointers, and iterators
|
||
referring to the elements in the sequence as well as the past-the-end iterator[.](#vector.capacity-11.sentence-1)
|
||
|
||
[*Note [3](#vector.capacity-note-3)*:
|
||
|
||
If no reallocation happens, they remain valid[.](#vector.capacity-11.sentence-2)
|
||
|
||
â *end note*]
|
||
|
||
[ð](#lib:swap,vector)
|
||
|
||
`constexpr void swap(vector& x)
|
||
noexcept(allocator_traits<Allocator>::propagate_on_container_swap::value ||
|
||
allocator_traits<Allocator>::is_always_equal::value);
|
||
`
|
||
|
||
[12](#vector.capacity-12)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L10229)
|
||
|
||
*Effects*: Exchanges the contents andcapacity() of*this with that of x[.](#vector.capacity-12.sentence-1)
|
||
|
||
[13](#vector.capacity-13)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L10237)
|
||
|
||
*Complexity*: Constant time[.](#vector.capacity-13.sentence-1)
|
||
|
||
[ð](#lib:resize,vector)
|
||
|
||
`constexpr void resize(size_type sz);
|
||
`
|
||
|
||
[14](#vector.capacity-14)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L10248)
|
||
|
||
*Preconditions*: T is*Cpp17MoveInsertable* and *Cpp17DefaultInsertable* into vector[.](#vector.capacity-14.sentence-1)
|
||
|
||
[15](#vector.capacity-15)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L10253)
|
||
|
||
*Effects*: If sz < size(), erases the last size() - sz elements
|
||
from the sequence[.](#vector.capacity-15.sentence-1)
|
||
|
||
Otherwise,
|
||
appends sz - size() default-inserted elements to the sequence[.](#vector.capacity-15.sentence-2)
|
||
|
||
[16](#vector.capacity-16)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L10259)
|
||
|
||
*Remarks*: If an exception is thrown other than by the move constructor of a non-*Cpp17CopyInsertable*T, there are no effects[.](#vector.capacity-16.sentence-1)
|
||
|
||
[ð](#lib:resize,vector_)
|
||
|
||
`constexpr void resize(size_type sz, const T& c);
|
||
`
|
||
|
||
[17](#vector.capacity-17)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L10271)
|
||
|
||
*Preconditions*: T is*Cpp17CopyInsertable* into vector[.](#vector.capacity-17.sentence-1)
|
||
|
||
[18](#vector.capacity-18)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L10276)
|
||
|
||
*Effects*: If sz < size(), erases the last size() - sz elements
|
||
from the sequence[.](#vector.capacity-18.sentence-1)
|
||
|
||
Otherwise,
|
||
appends sz - size() copies of c to the sequence[.](#vector.capacity-18.sentence-2)
|
||
|
||
[19](#vector.capacity-19)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L10282)
|
||
|
||
*Remarks*: If an exception is thrown, there are no effects[.](#vector.capacity-19.sentence-1)
|
||
|
||
[197)](#footnote-197)[197)](#footnoteref-197)
|
||
|
||
reserve() uses Allocator::allocate() which
|
||
can throw an appropriate exception[.](#footnote-197.sentence-1)
|
||
|
||
#### [23.3.13.4](#vector.data) Data [[vector.data]](vector.data)
|
||
|
||
[ð](#lib:data,vector)
|
||
|
||
`constexpr T* data() noexcept;
|
||
constexpr const T* data() const noexcept;
|
||
`
|
||
|
||
[1](#vector.data-1)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L10296)
|
||
|
||
*Returns*: A pointer such that [data(), data() + size()) is a valid range[.](#vector.data-1.sentence-1)
|
||
|
||
For a
|
||
non-empty vector, data() == addressof(front()) is true[.](#vector.data-1.sentence-2)
|
||
|
||
[2](#vector.data-2)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L10301)
|
||
|
||
*Complexity*: Constant time[.](#vector.data-2.sentence-1)
|
||
|
||
#### [23.3.13.5](#vector.modifiers) Modifiers [[vector.modifiers]](vector.modifiers)
|
||
|
||
[ð](#lib:insert,vector)
|
||
|
||
`constexpr iterator insert(const_iterator position, const T& x);
|
||
constexpr iterator insert(const_iterator position, T&& x);
|
||
constexpr iterator insert(const_iterator position, size_type n, const T& x);
|
||
template<class InputIterator>
|
||
constexpr iterator insert(const_iterator position, InputIterator first, InputIterator last);
|
||
template<[container-compatible-range](container.intro.reqmts#concept:container-compatible-range "23.2.2.1 Introduction [container.intro.reqmts]")<T> R>
|
||
constexpr iterator insert_range(const_iterator position, R&& rg);
|
||
constexpr iterator insert(const_iterator position, initializer_list<T>);
|
||
|
||
template<class... Args> constexpr reference emplace_back(Args&&... args);
|
||
template<class... Args> constexpr iterator emplace(const_iterator position, Args&&... args);
|
||
constexpr void push_back(const T& x);
|
||
constexpr void push_back(T&& x);
|
||
template<[container-compatible-range](container.intro.reqmts#concept:container-compatible-range "23.2.2.1 Introduction [container.intro.reqmts]")<T> R>
|
||
constexpr void append_range(R&& rg);
|
||
`
|
||
|
||
[1](#vector.modifiers-1)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L10328)
|
||
|
||
*Complexity*: If reallocation happens,
|
||
linear in the number of elements of the resulting vector;
|
||
otherwise,
|
||
linear in the number of elements inserted plus the distance
|
||
to the end of the vector[.](#vector.modifiers-1.sentence-1)
|
||
|
||
[2](#vector.modifiers-2)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L10336)
|
||
|
||
*Remarks*: Causes reallocation if the new size is greater than the old capacity[.](#vector.modifiers-2.sentence-1)
|
||
|
||
Reallocation invalidates all the references, pointers, and iterators
|
||
referring to the elements in the sequence, as well as the past-the-end iterator[.](#vector.modifiers-2.sentence-2)
|
||
|
||
If no reallocation happens, then
|
||
references, pointers, and iterators
|
||
before the insertion point remain valid
|
||
but those at or after the insertion point,
|
||
including the past-the-end iterator,
|
||
are invalidated[.](#vector.modifiers-2.sentence-3)
|
||
|
||
If an exception is thrown other than by
|
||
the copy constructor, move constructor,
|
||
assignment operator, or move assignment operator ofT or by any InputIterator operation,
|
||
there are no effects[.](#vector.modifiers-2.sentence-4)
|
||
|
||
If an exception is thrown while inserting a single element at the end andT is *Cpp17CopyInsertable* or is_nothrow_move_constructible_v<T> is true, there are no effects[.](#vector.modifiers-2.sentence-5)
|
||
|
||
Otherwise, if an exception is thrown by the move constructor of a non-*Cpp17CopyInsertable*T, the effects are unspecified[.](#vector.modifiers-2.sentence-6)
|
||
|
||
[3](#vector.modifiers-3)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L10358)
|
||
|
||
For the declarations taking a range R,
|
||
performs at most one reallocation if:
|
||
|
||
- [(3.1)](#vector.modifiers-3.1)
|
||
|
||
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, or
|
||
|
||
- [(3.2)](#vector.modifiers-3.2)
|
||
|
||
R models ranges::[forward_range](range.refinements#concept:forward_range "25.4.6 Other range refinements [range.refinements]") andR does not model ranges::[approximately_sized_range](range.approximately.sized#concept:approximately_sized_range "25.4.3 Approximately sized ranges [range.approximately.sized]")[.](#vector.modifiers-3.sentence-1)
|
||
|
||
For the declarations taking a pair of InputIterator,
|
||
performs at most one reallocation ifInputIterator meets the *Cpp17ForwardIterator* requirements[.](#vector.modifiers-3.sentence-2)
|
||
|
||
[ð](#lib:erase,vector)
|
||
|
||
`constexpr iterator erase(const_iterator position);
|
||
constexpr iterator erase(const_iterator first, const_iterator last);
|
||
constexpr void pop_back();
|
||
`
|
||
|
||
[4](#vector.modifiers-4)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L10382)
|
||
|
||
*Effects*: Invalidates iterators and references at or after the point of the erase[.](#vector.modifiers-4.sentence-1)
|
||
|
||
[5](#vector.modifiers-5)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L10386)
|
||
|
||
*Throws*: Nothing unless an exception is thrown by the
|
||
assignment operator or move assignment operator ofT[.](#vector.modifiers-5.sentence-1)
|
||
|
||
[6](#vector.modifiers-6)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L10392)
|
||
|
||
*Complexity*: The destructor of T is called the number of times equal to the
|
||
number of the elements erased, but the assignment operator
|
||
of T is called the number of times equal to the number of
|
||
elements in the vector after the erased elements[.](#vector.modifiers-6.sentence-1)
|
||
|
||
#### [23.3.13.6](#vector.erasure) Erasure [[vector.erasure]](vector.erasure)
|
||
|
||
[ð](#lib:erase,vector_)
|
||
|
||
`template<class T, class Allocator, class U = T>
|
||
constexpr typename vector<T, Allocator>::size_type
|
||
erase(vector<T, Allocator>& c, const U& value);
|
||
`
|
||
|
||
[1](#vector.erasure-1)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L10410)
|
||
|
||
*Effects*: Equivalent to:auto it = remove(c.begin(), c.end(), value);auto r = distance(it, c.end());
|
||
c.erase(it, c.end());return r;
|
||
|
||
[ð](#lib:erase_if,vector)
|
||
|
||
`template<class T, class Allocator, class Predicate>
|
||
constexpr typename vector<T, Allocator>::size_type
|
||
erase_if(vector<T, Allocator>& c, Predicate pred);
|
||
`
|
||
|
||
[2](#vector.erasure-2)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L10429)
|
||
|
||
*Effects*: Equivalent to:auto it = remove_if(c.begin(), c.end(), pred);auto r = distance(it, c.end());
|
||
c.erase(it, c.end());return r;
|
||
|
||
### [23.3.14](#vector.bool) Specialization of vector for bool [[vector.bool]](vector.bool)
|
||
|
||
#### [23.3.14.1](#vector.bool.pspc) Partial class template specialization vector<bool, Allocator> [[vector.bool.pspc]](vector.bool.pspc)
|
||
|
||
[1](#vector.bool.pspc-1)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L10444)
|
||
|
||
To optimize space allocation, a partial specialization of vector forbool elements is provided:namespace std {template<class Allocator>class vector<bool, Allocator> {public:// typesusing value_type = bool; using allocator_type = Allocator; using pointer = *implementation-defined*; using const_pointer = *implementation-defined*; using const_reference = bool; using size_type = *implementation-defined*; // see [[container.requirements]](container.requirements "23.2 Requirements")using difference_type = *implementation-defined*; // see [[container.requirements]](container.requirements "23.2 Requirements")using iterator = *implementation-defined*; // see [[container.requirements]](container.requirements "23.2 Requirements")using const_iterator = *implementation-defined*; // see [[container.requirements]](container.requirements "23.2 Requirements")using reverse_iterator = std::reverse_iterator<iterator>; using const_reverse_iterator = std::reverse_iterator<const_iterator>; // bit referenceclass [reference](#lib:vector%3cbool%3e,reference "23.3.14.1 Partial class template specialization vector<bool, Allocator> [vector.bool.pspc]") {public:constexpr reference(const reference&) = default; constexpr ~reference(); constexpr operator bool() const noexcept; constexpr reference& operator=(bool x) noexcept; constexpr reference& operator=(const reference& x) noexcept; constexpr const reference& operator=(bool x) const noexcept; constexpr void flip() noexcept; // flips the bit}; // construct/copy/destroyconstexpr vector() noexcept(noexcept(Allocator())) : vector(Allocator()) { }constexpr explicit vector(const Allocator&) noexcept; constexpr explicit vector(size_type n, const Allocator& = Allocator()); constexpr vector(size_type n, const bool& value, const Allocator& = Allocator()); template<class InputIterator>constexpr vector(InputIterator first, InputIterator last, const Allocator& = Allocator()); template<[*container-compatible-range*](container.intro.reqmts#concept:container-compatible-range "23.2.2.1 Introduction [container.intro.reqmts]")<bool> R>constexpr vector(from_range_t, R&& rg, const Allocator& = Allocator()); constexpr vector(const vector& x); constexpr vector(vector&& x) noexcept; constexpr vector(const vector&, const type_identity_t<Allocator>&); constexpr vector(vector&&, const type_identity_t<Allocator>&); constexpr vector(initializer_list<bool>, const Allocator& = Allocator()); constexpr ~vector(); constexpr vector& operator=(const vector& x); constexpr vector& operator=(vector&& x)noexcept(allocator_traits<Allocator>::propagate_on_container_move_assignment::value || allocator_traits<Allocator>::is_always_equal::value); constexpr vector& operator=(initializer_list<bool>); template<class InputIterator>constexpr void assign(InputIterator first, InputIterator last); template<[*container-compatible-range*](container.intro.reqmts#concept:container-compatible-range "23.2.2.1 Introduction [container.intro.reqmts]")<bool> R>constexpr void assign_range(R&& rg); constexpr void assign(size_type n, const bool& t); constexpr void assign(initializer_list<bool>); constexpr allocator_type get_allocator() const noexcept; // iteratorsconstexpr iterator begin() noexcept; constexpr const_iterator begin() const noexcept; constexpr iterator end() noexcept; constexpr const_iterator end() const noexcept; constexpr reverse_iterator rbegin() noexcept; constexpr const_reverse_iterator rbegin() const noexcept; constexpr reverse_iterator rend() noexcept; constexpr const_reverse_iterator rend() const noexcept; constexpr const_iterator cbegin() const noexcept; constexpr const_iterator cend() const noexcept; constexpr const_reverse_iterator crbegin() const noexcept; constexpr const_reverse_iterator crend() const noexcept; // capacityconstexpr bool empty() const noexcept; constexpr size_type size() const noexcept; constexpr size_type max_size() const noexcept; constexpr size_type capacity() const noexcept; constexpr void resize(size_type sz, bool c = false); constexpr void reserve(size_type n); constexpr void shrink_to_fit(); // element accessconstexpr reference operator[](size_type n); constexpr const_reference operator[](size_type n) const; constexpr reference at(size_type n); constexpr const_reference at(size_type n) const; constexpr reference front(); constexpr const_reference front() const; constexpr reference back(); constexpr const_reference back() const; // modifierstemplate<class... Args> constexpr reference emplace_back(Args&&... args); constexpr void push_back(const bool& x); template<[*container-compatible-range*](container.intro.reqmts#concept:container-compatible-range "23.2.2.1 Introduction [container.intro.reqmts]")<bool> R>constexpr void append_range(R&& rg); constexpr void pop_back(); template<class... Args> constexpr iterator emplace(const_iterator position, Args&&... args); constexpr iterator insert(const_iterator position, const bool& x); constexpr iterator insert(const_iterator position, size_type n, const bool& x); template<class InputIterator>constexpr iterator insert(const_iterator position,
|
||
InputIterator first, InputIterator last); template<[*container-compatible-range*](container.intro.reqmts#concept:container-compatible-range "23.2.2.1 Introduction [container.intro.reqmts]")<bool> R>constexpr iterator insert_range(const_iterator position, R&& rg); constexpr iterator insert(const_iterator position, initializer_list<bool> il); constexpr iterator erase(const_iterator position); constexpr iterator erase(const_iterator first, const_iterator last); constexpr void swap(vector&)noexcept(allocator_traits<Allocator>::propagate_on_container_swap::value || allocator_traits<Allocator>::is_always_equal::value); static constexpr void swap(reference x, reference y) noexcept; constexpr void flip() noexcept; // flips all bitsconstexpr void clear() noexcept; };}
|
||
|
||
[2](#vector.bool.pspc-2)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L10568)
|
||
|
||
Unless described below, all operations have the same requirements and
|
||
semantics as the primary vector template, except that operations
|
||
dealing with the bool value type map to bit values in the
|
||
container storage and[allocator_traits::construct](allocator.traits.members#lib:allocator_traits,construct "20.2.9.3 Static member functions [allocator.traits.members]") is not used to construct these values[.](#vector.bool.pspc-2.sentence-1)
|
||
|
||
[3](#vector.bool.pspc-3)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L10576)
|
||
|
||
There is no requirement that the data be stored as a contiguous allocation
|
||
of bool values[.](#vector.bool.pspc-3.sentence-1)
|
||
|
||
A space-optimized representation of bits is
|
||
recommended instead[.](#vector.bool.pspc-3.sentence-2)
|
||
|
||
[4](#vector.bool.pspc-4)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L10581)
|
||
|
||
reference is a class that simulates the behavior of references of a single bit invector<bool>[.](#vector.bool.pspc-4.sentence-1)
|
||
|
||
The conversion function returns true when the bit is set, and false otherwise[.](#vector.bool.pspc-4.sentence-2)
|
||
|
||
The assignment operators
|
||
set the bit when the argument is (convertible to) true and
|
||
clear it otherwise[.](#vector.bool.pspc-4.sentence-3)
|
||
|
||
flip reverses the state of the bit[.](#vector.bool.pspc-4.sentence-4)
|
||
|
||
[ð](#lib:flip,vector%3cbool%3e)
|
||
|
||
`constexpr void flip() noexcept;
|
||
`
|
||
|
||
[5](#vector.bool.pspc-5)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L10595)
|
||
|
||
*Effects*: Replaces each element in the container with its complement[.](#vector.bool.pspc-5.sentence-1)
|
||
|
||
[ð](#lib:swap,vector%3cbool%3e)
|
||
|
||
`static constexpr void swap(reference x, reference y) noexcept;
|
||
`
|
||
|
||
[6](#vector.bool.pspc-6)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L10606)
|
||
|
||
*Effects*: Exchanges the contents of x and y as if by:bool b = x;
|
||
x = y;
|
||
y = b;
|
||
|
||
[ð](#vector.bool.pspc-itemdecl:3)
|
||
|
||
`template<class Allocator> struct hash<vector<bool, Allocator>>;
|
||
`
|
||
|
||
[7](#vector.bool.pspc-7)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L10621)
|
||
|
||
The specialization is enabled ([[unord.hash]](unord.hash "22.10.19 Class template hash"))[.](#vector.bool.pspc-7.sentence-1)
|
||
|
||
[ð](#lib:is-vector-bool-reference)
|
||
|
||
`template<class T>
|
||
constexpr bool is-vector-bool-reference = see below;
|
||
`
|
||
|
||
[8](#vector.bool.pspc-8)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L10632)
|
||
|
||
The expression*is-vector-bool-reference*<T> is true if T denotes the type vector<bool, Alloc>::reference for some type Alloc andvector<bool, Alloc> is not a program-defined specialization[.](#vector.bool.pspc-8.sentence-1)
|
||
|
||
#### [23.3.14.2](#vector.bool.fmt) Formatter specialization for vector<bool> [[vector.bool.fmt]](vector.bool.fmt)
|
||
|
||
[ð](#lib:formatter)
|
||
|
||
namespace std {template<class T, class charT>requires *is-vector-bool-reference*<T>struct formatter<T, charT> {private: formatter<bool, charT> *underlying_*; // *exposition only*public:template<class ParseContext>constexpr typename ParseContext::iterator
|
||
parse(ParseContext& ctx); template<class FormatContext>typename FormatContext::iterator
|
||
format(const T& ref, FormatContext& ctx) const; };}
|
||
|
||
[ð](#lib:parse,formatter)
|
||
|
||
`template<class ParseContext>
|
||
constexpr typename ParseContext::iterator
|
||
parse(ParseContext& ctx);
|
||
`
|
||
|
||
[1](#vector.bool.fmt-1)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L10671)
|
||
|
||
Equivalent to: return *underlying_*.parse(ctx);
|
||
|
||
[ð](#lib:format,formatter)
|
||
|
||
`template<class FormatContext>
|
||
typename FormatContext::iterator
|
||
format(const T& ref, FormatContext& ctx) const;
|
||
`
|
||
|
||
[2](#vector.bool.fmt-2)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L10683)
|
||
|
||
Equivalent to: return *underlying_*.format(ref, ctx);
|
||
|
||
### [23.3.15](#inplace.vector.syn) Header <inplace_vector> synopsis [[inplace.vector.syn]](inplace.vector.syn)
|
||
|
||
[ð](#header:%3cinplace_vector%3e)
|
||
|
||
// mostly freestanding#include <compare> // see [[compare.syn]](compare.syn "17.12.1 Header <compare> synopsis")#include <initializer_list> // see [[initializer.list.syn]](initializer.list.syn "17.11.2 Header <initializer_list> synopsis")namespace std {// [[inplace.vector]](#inplace.vector "23.3.16 Class template inplace_vector"), class template inplace_vectortemplate<class T, size_t N> class inplace_vector; // partially freestanding// [[inplace.vector.erasure]](#inplace.vector.erasure "23.3.16.6 Erasure"), erasuretemplate<class T, size_t N, class U = T>constexpr typename inplace_vector<T, N>::size_type
|
||
erase(inplace_vector<T, N>& c, const U& value); template<class T, size_t N, class Predicate>constexpr typename inplace_vector<T, N>::size_type
|
||
erase_if(inplace_vector<T, N>& c, Predicate pred);}
|
||
|
||
### [23.3.16](#inplace.vector) Class template inplace_vector [[inplace.vector]](inplace.vector)
|
||
|
||
#### [23.3.16.1](#inplace.vector.overview) Overview [[inplace.vector.overview]](inplace.vector.overview)
|
||
|
||
[1](#inplace.vector.overview-1)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L10713)
|
||
|
||
An inplace_vector is a contiguous container[.](#inplace.vector.overview-1.sentence-1)
|
||
|
||
Its capacity is fixed and
|
||
its elements are stored within the inplace_vector object itself[.](#inplace.vector.overview-1.sentence-2)
|
||
|
||
[2](#inplace.vector.overview-2)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L10719)
|
||
|
||
An inplace_vector meets all of the requirements
|
||
of a container ([[container.reqmts]](container.reqmts "23.2.2.2 Container requirements")),
|
||
of a reversible container ([[container.rev.reqmts]](container.rev.reqmts "23.2.2.3 Reversible container requirements")),
|
||
of a contiguous container, and
|
||
of a sequence container,
|
||
including most of the optional sequence container requirements ([[sequence.reqmts]](sequence.reqmts "23.2.4 Sequence containers"))[.](#inplace.vector.overview-2.sentence-1)
|
||
|
||
The exceptions are thepush_front,prepend_range,pop_front, andemplace_front member functions, which are not provided[.](#inplace.vector.overview-2.sentence-2)
|
||
|
||
Descriptions are provided here only
|
||
for operations on inplace_vector that
|
||
are not described in one of these tables or
|
||
for operations where there is additional semantic information[.](#inplace.vector.overview-2.sentence-3)
|
||
|
||
[3](#inplace.vector.overview-3)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L10737)
|
||
|
||
For any N,inplace_vector<T, N>::iterator andinplace_vector<T, N>::const_iterator meet the constexpr iterator requirements[.](#inplace.vector.overview-3.sentence-1)
|
||
|
||
[4](#inplace.vector.overview-4)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L10743)
|
||
|
||
Any member function of inplace_vector<T, N> that
|
||
would cause the size to exceed N throws an exception of type bad_alloc[.](#inplace.vector.overview-4.sentence-1)
|
||
|
||
[5](#inplace.vector.overview-5)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L10748)
|
||
|
||
Let IV denote a specialization of inplace_vector<T, N>[.](#inplace.vector.overview-5.sentence-1)
|
||
|
||
If N is zero, thenIV is trivially copyable and empty, andstd::is_trivially_default_constructible_v<IV> is true[.](#inplace.vector.overview-5.sentence-2)
|
||
|
||
Otherwise:
|
||
|
||
- [(5.1)](#inplace.vector.overview-5.1)
|
||
|
||
If is_trivially_copy_constructible_v<T> is true, thenIV has a trivial copy constructor[.](#inplace.vector.overview-5.1.sentence-1)
|
||
|
||
- [(5.2)](#inplace.vector.overview-5.2)
|
||
|
||
If is_trivially_move_constructible_v<T> is true, thenIV has a trivial move constructor[.](#inplace.vector.overview-5.2.sentence-1)
|
||
|
||
- [(5.3)](#inplace.vector.overview-5.3)
|
||
|
||
If is_trivially_destructible_v<T> is true, then:
|
||
* [(5.3.1)](#inplace.vector.overview-5.3.1)
|
||
|
||
IV has a trivial destructor.
|
||
|
||
* [(5.3.2)](#inplace.vector.overview-5.3.2)
|
||
|
||
If is_trivially_copy_constructible_v<T> && is_trivially_copy_assignable_v<T> is true, then IV has a trivial copy assignment operator.
|
||
|
||
* [(5.3.3)](#inplace.vector.overview-5.3.3)
|
||
|
||
If is_trivially_move_constructible_v<T> && is_trivially_move_assignable_v<T> is true, then IV has a trivial move assignment operator.
|
||
|
||
namespace std {template<class T, size_t N>class inplace_vector {public:// types:using value_type = T; using pointer = T*; using const_pointer = const T*; using reference = value_type&; using const_reference = const value_type&; using size_type = size_t; using difference_type = ptrdiff_t; using iterator = *implementation-defined*; // see [[container.requirements]](container.requirements "23.2 Requirements")using const_iterator = *implementation-defined*; // see [[container.requirements]](container.requirements "23.2 Requirements")using reverse_iterator = std::reverse_iterator<iterator>; using const_reverse_iterator = std::reverse_iterator<const_iterator>; // [[inplace.vector.cons]](#inplace.vector.cons "23.3.16.2 Constructors"), construct/copy/destroyconstexpr inplace_vector() noexcept; constexpr explicit inplace_vector(size_type n); // freestanding-deletedconstexpr inplace_vector(size_type n, const T& value); // freestanding-deletedtemplate<class InputIterator>constexpr inplace_vector(InputIterator first, InputIterator last); // freestanding-deletedtemplate<[*container-compatible-range*](container.intro.reqmts#concept:container-compatible-range "23.2.2.1 Introduction [container.intro.reqmts]")<T> R>constexpr inplace_vector(from_range_t, R&& rg); // freestanding-deletedconstexpr inplace_vector(const inplace_vector&); constexpr inplace_vector(inplace_vector&&)noexcept(N == 0 || is_nothrow_move_constructible_v<T>); constexpr inplace_vector(initializer_list<T> il); // freestanding-deletedconstexpr ~inplace_vector(); constexpr inplace_vector& operator=(const inplace_vector& other); constexpr inplace_vector& operator=(inplace_vector&& other)noexcept(N == 0 || (is_nothrow_move_assignable_v<T> && is_nothrow_move_constructible_v<T>)); constexpr inplace_vector& operator=(initializer_list<T>); // freestanding-deletedtemplate<class InputIterator>constexpr void assign(InputIterator first, InputIterator last); // freestanding-deletedtemplate<[*container-compatible-range*](container.intro.reqmts#concept:container-compatible-range "23.2.2.1 Introduction [container.intro.reqmts]")<T> R>constexpr void assign_range(R&& rg); // freestanding-deletedconstexpr void assign(size_type n, const T& u); // freestanding-deletedconstexpr void assign(initializer_list<T> il); // freestanding-deleted// iteratorsconstexpr iterator begin() noexcept; constexpr const_iterator begin() const noexcept; constexpr iterator end() noexcept; constexpr const_iterator end() const noexcept; constexpr reverse_iterator rbegin() noexcept; constexpr const_reverse_iterator rbegin() const noexcept; constexpr reverse_iterator rend() noexcept; constexpr const_reverse_iterator rend() const noexcept; constexpr const_iterator cbegin() const noexcept; constexpr const_iterator cend() const noexcept; constexpr const_reverse_iterator crbegin() const noexcept; constexpr const_reverse_iterator crend() const noexcept; // [[inplace.vector.capacity]](#inplace.vector.capacity "23.3.16.3 Capacity"), capacityconstexpr bool empty() const noexcept; constexpr size_type size() const noexcept; static constexpr size_type max_size() noexcept; static constexpr size_type capacity() noexcept; constexpr void resize(size_type sz); // freestanding-deletedconstexpr void resize(size_type sz, const T& c); // freestanding-deletedstatic constexpr void reserve(size_type n); // freestanding-deletedstatic constexpr void shrink_to_fit() noexcept; // element accessconstexpr reference operator[](size_type n); constexpr const_reference operator[](size_type n) const; constexpr reference at(size_type n); // freestanding-deletedconstexpr const_reference at(size_type n) const; // freestanding-deletedconstexpr reference front(); constexpr const_reference front() const; constexpr reference back(); constexpr const_reference back() const; // [[inplace.vector.data]](#inplace.vector.data "23.3.16.4 Data"), data accessconstexpr T* data() noexcept; constexpr const T* data() const noexcept; // [[inplace.vector.modifiers]](#inplace.vector.modifiers "23.3.16.5 Modifiers"), modifierstemplate<class... Args>constexpr reference emplace_back(Args&&... args); // freestanding-deletedconstexpr reference push_back(const T& x); // freestanding-deletedconstexpr reference push_back(T&& x); // freestanding-deletedtemplate<[*container-compatible-range*](container.intro.reqmts#concept:container-compatible-range "23.2.2.1 Introduction [container.intro.reqmts]")<T> R>constexpr void append_range(R&& rg); // freestanding-deletedconstexpr void pop_back(); template<class... Args>constexpr pointer try_emplace_back(Args&&... args); constexpr pointer try_push_back(const T& x); constexpr pointer try_push_back(T&& x); template<[*container-compatible-range*](container.intro.reqmts#concept:container-compatible-range "23.2.2.1 Introduction [container.intro.reqmts]")<T> R>constexpr ranges::borrowed_iterator_t<R> try_append_range(R&& rg); template<class... Args>constexpr reference unchecked_emplace_back(Args&&... args); constexpr reference unchecked_push_back(const T& x); constexpr reference unchecked_push_back(T&& x); template<class... Args>constexpr iterator emplace(const_iterator position, Args&&... args); // freestanding-deletedconstexpr iterator insert(const_iterator position, const T& x); // freestanding-deletedconstexpr iterator insert(const_iterator position, T&& x); // freestanding-deletedconstexpr iterator insert(const_iterator position, size_type n, // freestanding-deletedconst T& x); template<class InputIterator>constexpr iterator insert(const_iterator position, // freestanding-deleted InputIterator first, InputIterator last); template<[*container-compatible-range*](container.intro.reqmts#concept:container-compatible-range "23.2.2.1 Introduction [container.intro.reqmts]")<T> R>constexpr iterator insert_range(const_iterator position, R&& rg); // freestanding-deletedconstexpr iterator insert(const_iterator position, // freestanding-deleted initializer_list<T> il); constexpr iterator erase(const_iterator position); constexpr iterator erase(const_iterator first, const_iterator last); constexpr void swap(inplace_vector& x)noexcept(N == 0 || (is_nothrow_swappable_v<T> && is_nothrow_move_constructible_v<T>)); constexpr void clear() noexcept; friend constexpr bool operator==(const inplace_vector& x, const inplace_vector& y); friend constexpr *synth-three-way-result*<T>operator<=>(const inplace_vector& x, const inplace_vector& y); friend constexpr void swap(inplace_vector& x, inplace_vector& y)noexcept(N == 0 || (is_nothrow_swappable_v<T> && is_nothrow_move_constructible_v<T>)){ x.swap(y); }};}
|
||
|
||
#### [23.3.16.2](#inplace.vector.cons) Constructors [[inplace.vector.cons]](inplace.vector.cons)
|
||
|
||
[ð](#lib:inplace_vector,constructor)
|
||
|
||
`constexpr explicit inplace_vector(size_type n);
|
||
`
|
||
|
||
[1](#inplace.vector.cons-1)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L10926)
|
||
|
||
*Preconditions*: T is *Cpp17DefaultInsertable* into inplace_vector[.](#inplace.vector.cons-1.sentence-1)
|
||
|
||
[2](#inplace.vector.cons-2)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L10930)
|
||
|
||
*Effects*: Constructs an inplace_vector with n default-inserted elements[.](#inplace.vector.cons-2.sentence-1)
|
||
|
||
[3](#inplace.vector.cons-3)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L10934)
|
||
|
||
*Complexity*: Linear in n[.](#inplace.vector.cons-3.sentence-1)
|
||
|
||
[ð](#lib:inplace_vector,constructor_)
|
||
|
||
`constexpr inplace_vector(size_type n, const T& value);
|
||
`
|
||
|
||
[4](#inplace.vector.cons-4)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L10945)
|
||
|
||
*Preconditions*: T is *Cpp17CopyInsertable* into inplace_vector[.](#inplace.vector.cons-4.sentence-1)
|
||
|
||
[5](#inplace.vector.cons-5)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L10949)
|
||
|
||
*Effects*: Constructs an inplace_vector with n copies of value[.](#inplace.vector.cons-5.sentence-1)
|
||
|
||
[6](#inplace.vector.cons-6)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L10953)
|
||
|
||
*Complexity*: Linear in n[.](#inplace.vector.cons-6.sentence-1)
|
||
|
||
[ð](#lib:inplace_vector,constructor__)
|
||
|
||
`template<class InputIterator>
|
||
constexpr inplace_vector(InputIterator first, InputIterator last);
|
||
`
|
||
|
||
[7](#inplace.vector.cons-7)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L10965)
|
||
|
||
*Effects*: Constructs an inplace_vector equal to the range [first, last)[.](#inplace.vector.cons-7.sentence-1)
|
||
|
||
[8](#inplace.vector.cons-8)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L10969)
|
||
|
||
*Complexity*: Linear in distance(first, last)[.](#inplace.vector.cons-8.sentence-1)
|
||
|
||
[ð](#lib:inplace_vector,constructor___)
|
||
|
||
`template<[container-compatible-range](container.intro.reqmts#concept:container-compatible-range "23.2.2.1 Introduction [container.intro.reqmts]")<T> R>
|
||
constexpr inplace_vector(from_range_t, R&& rg);
|
||
`
|
||
|
||
[9](#inplace.vector.cons-9)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L10981)
|
||
|
||
*Effects*: Constructs an inplace_vector with
|
||
the elements of the range rg[.](#inplace.vector.cons-9.sentence-1)
|
||
|
||
[10](#inplace.vector.cons-10)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L10986)
|
||
|
||
*Complexity*: Linear in ranges::distance(rg)[.](#inplace.vector.cons-10.sentence-1)
|
||
|
||
#### [23.3.16.3](#inplace.vector.capacity) Capacity [[inplace.vector.capacity]](inplace.vector.capacity)
|
||
|
||
[ð](#lib:capacity,inplace_vector)
|
||
|
||
`static constexpr size_type capacity() noexcept;
|
||
static constexpr size_type max_size() noexcept;
|
||
`
|
||
|
||
[1](#inplace.vector.capacity-1)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L11001)
|
||
|
||
*Returns*: N[.](#inplace.vector.capacity-1.sentence-1)
|
||
|
||
[ð](#lib:resize,inplace_vector)
|
||
|
||
`constexpr void resize(size_type sz);
|
||
`
|
||
|
||
[2](#inplace.vector.capacity-2)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L11012)
|
||
|
||
*Preconditions*: T is *Cpp17DefaultInsertable* into inplace_vector[.](#inplace.vector.capacity-2.sentence-1)
|
||
|
||
[3](#inplace.vector.capacity-3)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L11016)
|
||
|
||
*Effects*: If sz < size(),
|
||
erases the last size() - sz elements from the sequence[.](#inplace.vector.capacity-3.sentence-1)
|
||
|
||
Otherwise,
|
||
appends sz - size() default-inserted elements to the sequence[.](#inplace.vector.capacity-3.sentence-2)
|
||
|
||
[4](#inplace.vector.capacity-4)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L11024)
|
||
|
||
*Remarks*: If an exception is thrown, there are no effects on *this[.](#inplace.vector.capacity-4.sentence-1)
|
||
|
||
[ð](#lib:resize,inplace_vector_)
|
||
|
||
`constexpr void resize(size_type sz, const T& c);
|
||
`
|
||
|
||
[5](#inplace.vector.capacity-5)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L11035)
|
||
|
||
*Preconditions*: T is *Cpp17CopyInsertable* into inplace_vector[.](#inplace.vector.capacity-5.sentence-1)
|
||
|
||
[6](#inplace.vector.capacity-6)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L11039)
|
||
|
||
*Effects*: If sz < size(),
|
||
erases the last size() - sz elements from the sequence[.](#inplace.vector.capacity-6.sentence-1)
|
||
|
||
Otherwise,
|
||
appends sz - size() copies of c to the sequence[.](#inplace.vector.capacity-6.sentence-2)
|
||
|
||
[7](#inplace.vector.capacity-7)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L11047)
|
||
|
||
*Remarks*: If an exception is thrown, there are no effects on *this[.](#inplace.vector.capacity-7.sentence-1)
|
||
|
||
[ð](#lib:reserve,inplace_vector)
|
||
|
||
`static constexpr void reserve(size_type n);
|
||
`
|
||
|
||
[8](#inplace.vector.capacity-8)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L11058)
|
||
|
||
*Effects*: None[.](#inplace.vector.capacity-8.sentence-1)
|
||
|
||
[9](#inplace.vector.capacity-9)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L11062)
|
||
|
||
*Throws*: bad_alloc if n > capacity() is true[.](#inplace.vector.capacity-9.sentence-1)
|
||
|
||
[ð](#lib:shrink_to_fit,inplace_vector)
|
||
|
||
`static constexpr void shrink_to_fit() noexcept;
|
||
`
|
||
|
||
[10](#inplace.vector.capacity-10)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L11073)
|
||
|
||
*Effects*: None[.](#inplace.vector.capacity-10.sentence-1)
|
||
|
||
#### [23.3.16.4](#inplace.vector.data) Data [[inplace.vector.data]](inplace.vector.data)
|
||
|
||
[ð](#lib:data,inplace_vector)
|
||
|
||
`constexpr T* data() noexcept;
|
||
constexpr const T* data() const noexcept;
|
||
`
|
||
|
||
[1](#inplace.vector.data-1)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L11087)
|
||
|
||
*Returns*: A pointer such that [data(), data() + size()) is a valid range[.](#inplace.vector.data-1.sentence-1)
|
||
|
||
For a non-empty inplace_vector,data() == addressof(front()) is true[.](#inplace.vector.data-1.sentence-2)
|
||
|
||
[2](#inplace.vector.data-2)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L11093)
|
||
|
||
*Complexity*: Constant time[.](#inplace.vector.data-2.sentence-1)
|
||
|
||
#### [23.3.16.5](#inplace.vector.modifiers) Modifiers [[inplace.vector.modifiers]](inplace.vector.modifiers)
|
||
|
||
[ð](#lib:insert,inplace_vector)
|
||
|
||
`constexpr iterator insert(const_iterator position, const T& x);
|
||
constexpr iterator insert(const_iterator position, T&& x);
|
||
constexpr iterator insert(const_iterator position, size_type n, const T& x);
|
||
template<class InputIterator>
|
||
constexpr iterator insert(const_iterator position, InputIterator first, InputIterator last);
|
||
template<[container-compatible-range](container.intro.reqmts#concept:container-compatible-range "23.2.2.1 Introduction [container.intro.reqmts]")<T> R>
|
||
constexpr iterator insert_range(const_iterator position, R&& rg);
|
||
constexpr iterator insert(const_iterator position, initializer_list<T> il);
|
||
|
||
template<class... Args>
|
||
constexpr iterator emplace(const_iterator position, Args&&... args);
|
||
template<[container-compatible-range](container.intro.reqmts#concept:container-compatible-range "23.2.2.1 Introduction [container.intro.reqmts]")<T> R>
|
||
constexpr void append_range(R&& rg);
|
||
`
|
||
|
||
[1](#inplace.vector.modifiers-1)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L11121)
|
||
|
||
Let n be the value of size() before this call for
|
||
the append_range overload, anddistance(begin, position) otherwise[.](#inplace.vector.modifiers-1.sentence-1)
|
||
|
||
[2](#inplace.vector.modifiers-2)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L11126)
|
||
|
||
*Complexity*: Linear in the number of elements inserted plus
|
||
the distance to the end of the vector[.](#inplace.vector.modifiers-2.sentence-1)
|
||
|
||
[3](#inplace.vector.modifiers-3)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L11131)
|
||
|
||
*Remarks*: If an exception is thrown other than by the
|
||
copy constructor,
|
||
move constructor,
|
||
assignment operator, or
|
||
move assignment operator
|
||
of T or by
|
||
any InputIterator operation,
|
||
there are no effects[.](#inplace.vector.modifiers-3.sentence-1)
|
||
|
||
Otherwise,
|
||
if an exception is thrown, thensize() ⥠n and
|
||
elements in the range begin() + [0, n) are not modified[.](#inplace.vector.modifiers-3.sentence-2)
|
||
|
||
[ð](#lib:push_back,inplace_vector)
|
||
|
||
`constexpr reference push_back(const T& x);
|
||
constexpr reference push_back(T&& x);
|
||
template<class... Args>
|
||
constexpr reference emplace_back(Args&&... args);
|
||
`
|
||
|
||
[4](#inplace.vector.modifiers-4)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L11157)
|
||
|
||
*Returns*: back()[.](#inplace.vector.modifiers-4.sentence-1)
|
||
|
||
[5](#inplace.vector.modifiers-5)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L11161)
|
||
|
||
*Throws*: bad_alloc or
|
||
any exception thrown by the initialization of the inserted element[.](#inplace.vector.modifiers-5.sentence-1)
|
||
|
||
[6](#inplace.vector.modifiers-6)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L11166)
|
||
|
||
*Complexity*: Constant[.](#inplace.vector.modifiers-6.sentence-1)
|
||
|
||
[7](#inplace.vector.modifiers-7)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L11170)
|
||
|
||
*Remarks*: If an exception is thrown, there are no effects on *this[.](#inplace.vector.modifiers-7.sentence-1)
|
||
|
||
[ð](#lib:try_emplace_back,inplace_vector)
|
||
|
||
`template<class... Args>
|
||
constexpr pointer try_emplace_back(Args&&... args);
|
||
constexpr pointer try_push_back(const T& x);
|
||
constexpr pointer try_push_back(T&& x);
|
||
`
|
||
|
||
[8](#inplace.vector.modifiers-8)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L11185)
|
||
|
||
Let vals denote a pack:
|
||
|
||
- [(8.1)](#inplace.vector.modifiers-8.1)
|
||
|
||
std::forward<Args>(args)... for the first overload,
|
||
|
||
- [(8.2)](#inplace.vector.modifiers-8.2)
|
||
|
||
x for the second overload,
|
||
|
||
- [(8.3)](#inplace.vector.modifiers-8.3)
|
||
|
||
std::move(x) for the third overload[.](#inplace.vector.modifiers-8.sentence-1)
|
||
|
||
[9](#inplace.vector.modifiers-9)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L11193)
|
||
|
||
*Preconditions*: value_type is *Cpp17EmplaceConstructible* into inplace_vector from vals...[.](#inplace.vector.modifiers-9.sentence-1)
|
||
|
||
[10](#inplace.vector.modifiers-10)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L11198)
|
||
|
||
*Effects*: If size() < capacity() is true,
|
||
appends an object of type T direct-non-list-initialized with vals...[.](#inplace.vector.modifiers-10.sentence-1)
|
||
|
||
Otherwise, there are no effects[.](#inplace.vector.modifiers-10.sentence-2)
|
||
|
||
[11](#inplace.vector.modifiers-11)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L11205)
|
||
|
||
*Returns*: nullptr if size() == capacity() is true,
|
||
otherwise addressof(back())[.](#inplace.vector.modifiers-11.sentence-1)
|
||
|
||
[12](#inplace.vector.modifiers-12)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L11210)
|
||
|
||
*Throws*: Nothing unless an exception is thrown by the initialization of the inserted element[.](#inplace.vector.modifiers-12.sentence-1)
|
||
|
||
[13](#inplace.vector.modifiers-13)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L11214)
|
||
|
||
*Complexity*: Constant[.](#inplace.vector.modifiers-13.sentence-1)
|
||
|
||
[14](#inplace.vector.modifiers-14)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L11218)
|
||
|
||
*Remarks*: If an exception is thrown, there are no effects on *this[.](#inplace.vector.modifiers-14.sentence-1)
|
||
|
||
[ð](#lib:try_append_range,inplace_vector)
|
||
|
||
`template<[container-compatible-range](container.intro.reqmts#concept:container-compatible-range "23.2.2.1 Introduction [container.intro.reqmts]")<T> R>
|
||
constexpr ranges::borrowed_iterator_t<R> try_append_range(R&& rg);
|
||
`
|
||
|
||
[15](#inplace.vector.modifiers-15)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L11230)
|
||
|
||
*Preconditions*: value_type is *Cpp17EmplaceConstructible* into inplace_vector from
|
||
|
||
*ranges::begin(rg)[.](#inplace.vector.modifiers-15.sentence-2)
|
||
|
||
[16](#inplace.vector.modifiers-16)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L11235)
|
||
|
||
*Effects*: Appends copies of initial elements in rg before end(),
|
||
until all elements are inserted or size() == capacity() is true[.](#inplace.vector.modifiers-16.sentence-1)
|
||
|
||
Each iterator in the range rg is dereferenced at most once[.](#inplace.vector.modifiers-16.sentence-2)
|
||
|
||
[17](#inplace.vector.modifiers-17)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L11241)
|
||
|
||
*Returns*: An iterator pointing to the first element of rg that was not inserted into *this,
|
||
or ranges::end(rg) if no such element exists[.](#inplace.vector.modifiers-17.sentence-1)
|
||
|
||
[18](#inplace.vector.modifiers-18)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L11247)
|
||
|
||
*Complexity*: Linear in the number of elements inserted[.](#inplace.vector.modifiers-18.sentence-1)
|
||
|
||
[19](#inplace.vector.modifiers-19)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L11251)
|
||
|
||
*Remarks*: Let n be the value of size() prior to this call[.](#inplace.vector.modifiers-19.sentence-1)
|
||
|
||
If an exception is thrown after the insertion of k elements, thensize() equals n+k,
|
||
elements in the range begin() + [0, n) are not modified, and
|
||
elements in the range begin() + [n, n+k) correspond to
|
||
the inserted elements[.](#inplace.vector.modifiers-19.sentence-2)
|
||
|
||
[ð](#lib:unchecked_emplace_back,inplace_vector)
|
||
|
||
`template<class... Args>
|
||
constexpr reference unchecked_emplace_back(Args&&... args);
|
||
`
|
||
|
||
[20](#inplace.vector.modifiers-20)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L11268)
|
||
|
||
*Preconditions*: size() < capacity() is true[.](#inplace.vector.modifiers-20.sentence-1)
|
||
|
||
[21](#inplace.vector.modifiers-21)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L11272)
|
||
|
||
*Effects*: Equivalent to:return *try_emplace_back(std::forward<Args>(args)...);
|
||
|
||
[ð](#lib:unchecked_push_back,inplace_vector)
|
||
|
||
`constexpr reference unchecked_push_back(const T& x);
|
||
constexpr reference unchecked_push_back(T&& x);
|
||
`
|
||
|
||
[22](#inplace.vector.modifiers-22)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L11285)
|
||
|
||
*Preconditions*: size() < capacity() is true[.](#inplace.vector.modifiers-22.sentence-1)
|
||
|
||
[23](#inplace.vector.modifiers-23)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L11289)
|
||
|
||
*Effects*: Equivalent to:return *try_push_back(std::forward<decltype(x)>(x));
|
||
|
||
[ð](#lib:erase,inplace_vector)
|
||
|
||
`constexpr iterator erase(const_iterator position);
|
||
constexpr iterator erase(const_iterator first, const_iterator last);
|
||
constexpr void pop_back();
|
||
`
|
||
|
||
[24](#inplace.vector.modifiers-24)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L11304)
|
||
|
||
*Effects*: Invalidates iterators and references at or after the point of the erase[.](#inplace.vector.modifiers-24.sentence-1)
|
||
|
||
[25](#inplace.vector.modifiers-25)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L11308)
|
||
|
||
*Throws*: Nothing unless an exception is thrown by
|
||
the assignment operator or move assignment operator of T[.](#inplace.vector.modifiers-25.sentence-1)
|
||
|
||
[26](#inplace.vector.modifiers-26)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L11313)
|
||
|
||
*Complexity*: The destructor of T is called the number of times
|
||
equal to the number of the elements erased, but
|
||
the assignment operator of T is called the number of times
|
||
equal to the number of elements after the erased elements[.](#inplace.vector.modifiers-26.sentence-1)
|
||
|
||
#### [23.3.16.6](#inplace.vector.erasure) Erasure [[inplace.vector.erasure]](inplace.vector.erasure)
|
||
|
||
[ð](#lib:erase,inplace_vector_)
|
||
|
||
`template<class T, size_t N, class U = T>
|
||
constexpr size_t erase(inplace_vector<T, N>& c, const U& value);
|
||
`
|
||
|
||
[1](#inplace.vector.erasure-1)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L11330)
|
||
|
||
*Effects*: Equivalent to:auto it = remove(c.begin(), c.end(), value);auto r = distance(it, c.end());
|
||
c.erase(it, c.end());return r;
|
||
|
||
[ð](#lib:erase_if,inplace_vector)
|
||
|
||
`template<class T, size_t N, class Predicate>
|
||
constexpr size_t erase_if(inplace_vector<T, N>& c, Predicate pred);
|
||
`
|
||
|
||
[2](#inplace.vector.erasure-2)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L11348)
|
||
|
||
*Effects*: Equivalent to:auto it = remove_if(c.begin(), c.end(), pred);auto r = distance(it, c.end());
|
||
c.erase(it, c.end());return r;
|