Files
2025-10-25 03:02:53 +03:00

26 KiB
Raw Permalink Blame History

[inplace.vector]

23 Containers library [containers]

23.3 Sequence containers [sequences]

23.3.16 Class template inplace_vector [inplace.vector]

23.3.16.1 Overview [inplace.vector.overview]

1

#

An inplace_vector is a contiguous container.

Its capacity is fixed and its elements are stored within the inplace_vector object itself.

2

#

An inplace_vector meets all of the requirements of a container ([container.reqmts]), of a reversible container ([container.rev.reqmts]), of a contiguous container, and of a sequence container, including most of the optional sequence container requirements ([sequence.reqmts]).

The exceptions are thepush_front,prepend_range,pop_front, andemplace_front member functions, which are not provided.

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.

3

#

For any N,inplace_vector<T, N>::iterator andinplace_vector<T, N>::const_iterator meet the constexpr iterator requirements.

4

#

Any member function of inplace_vector<T, N> that would cause the size to exceed N throws an exception of type bad_alloc.

5

#

Let IV denote a specialization of inplace_vector<T, N>.

If N is zero, thenIV is trivially copyable and empty, andstd::is_trivially_default_constructible_v is true.

Otherwise:

  • (5.1)

    If is_trivially_copy_constructible_v is true, thenIV has a trivial copy constructor.

  • (5.2)

    If is_trivially_move_constructible_v is true, thenIV has a trivial move constructor.

  • (5.3)

    If is_trivially_destructible_v is true, then:

IV has a trivial destructor.

If is_trivially_copy_constructible_v && is_trivially_copy_assignable_v is true, then IV has a trivial copy assignment operator.

If is_trivially_move_constructible_v && is_trivially_move_assignable_v 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]using const_iterator = implementation-defined; // see [container.requirements]using reverse_iterator = std::reverse_iterator; using const_reverse_iterator = std::reverse_iterator<const_iterator>; // [inplace.vector.cons], construct/copy/destroyconstexpr inplace_vector() noexcept; constexpr explicit inplace_vector(size_type n); // freestanding-deletedconstexpr inplace_vector(size_type n, const T& value); // freestanding-deletedtemplateconstexpr inplace_vector(InputIterator first, InputIterator last); // freestanding-deletedtemplate<container-compatible-range 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); constexpr inplace_vector(initializer_list 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 && is_nothrow_move_constructible_v)); constexpr inplace_vector& operator=(initializer_list); // freestanding-deletedtemplateconstexpr void assign(InputIterator first, InputIterator last); // freestanding-deletedtemplate<container-compatible-range R>constexpr void assign_range(R&& rg); // freestanding-deletedconstexpr void assign(size_type n, const T& u); // freestanding-deletedconstexpr void assign(initializer_list 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], 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], data accessconstexpr T* data() noexcept; constexpr const T* data() const noexcept; // [inplace.vector.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 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 R>constexpr ranges::borrowed_iterator_t 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); templateconstexpr iterator insert(const_iterator position, // freestanding-deleted InputIterator first, InputIterator last); template<container-compatible-range R>constexpr iterator insert_range(const_iterator position, R&& rg); // freestanding-deletedconstexpr iterator insert(const_iterator position, // freestanding-deleted initializer_list 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 && is_nothrow_move_constructible_v)); constexpr void clear() noexcept; friend constexpr bool operator==(const inplace_vector& x, const inplace_vector& y); friend constexpr synth-three-way-resultoperator<=>(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 && is_nothrow_move_constructible_v)){ x.swap(y); }};}

23.3.16.2 Constructors [inplace.vector.cons]

🔗

constexpr explicit inplace_vector(size_type n);

1

#

Preconditions: T is Cpp17DefaultInsertable into inplace_vector.

2

#

Effects: Constructs an inplace_vector with n default-inserted elements.

3

#

Complexity: Linear in n.

🔗

constexpr inplace_vector(size_type n, const T& value);

4

#

Preconditions: T is Cpp17CopyInsertable into inplace_vector.

5

#

Effects: Constructs an inplace_vector with n copies of value.

6

#

Complexity: Linear in n.

🔗

template<class InputIterator> constexpr inplace_vector(InputIterator first, InputIterator last);

7

#

Effects: Constructs an inplace_vector equal to the range [first, last).

8

#

Complexity: Linear in distance(first, last).

🔗

template<[container-compatible-range](container.intro.reqmts#concept:container-compatible-range "23.2.2.1Introduction[container.intro.reqmts]")<T> R> constexpr inplace_vector(from_range_t, R&& rg);

9

#

Effects: Constructs an inplace_vector with the elements of the range rg.

10

#

Complexity: Linear in ranges::distance(rg).

23.3.16.3 Capacity [inplace.vector.capacity]

🔗

static constexpr size_type capacity() noexcept; static constexpr size_type max_size() noexcept;

1

#

Returns: N.

🔗

constexpr void resize(size_type sz);

2

#

Preconditions: T is Cpp17DefaultInsertable into inplace_vector.

3

#

Effects: If sz < size(), erases the last size() - sz elements from the sequence.

Otherwise, appends sz - size() default-inserted elements to the sequence.

4

#

Remarks: If an exception is thrown, there are no effects on *this.

🔗

constexpr void resize(size_type sz, const T& c);

5

#

Preconditions: T is Cpp17CopyInsertable into inplace_vector.

6

#

Effects: If sz < size(), erases the last size() - sz elements from the sequence.

Otherwise, appends sz - size() copies of c to the sequence.

7

#

Remarks: If an exception is thrown, there are no effects on *this.

🔗

static constexpr void reserve(size_type n);

8

#

Effects: None.

9

#

Throws: bad_alloc if n > capacity() is true.

🔗

static constexpr void shrink_to_fit() noexcept;

10

#

Effects: None.

23.3.16.4 Data [inplace.vector.data]

🔗

constexpr T* data() noexcept; constexpr const T* data() const noexcept;

1

#

Returns: A pointer such that [data(), data() + size()) is a valid range.

For a non-empty inplace_vector,data() == addressof(front()) is true.

2

#

Complexity: Constant time.

23.3.16.5 Modifiers [inplace.vector.modifiers]

🔗

`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 constexpr iterator insert(const_iterator position, InputIterator first, InputIterator last); template<container-compatible-range R> constexpr iterator insert_range(const_iterator position, R&& rg); constexpr iterator insert(const_iterator position, initializer_list il);

template<class... Args> constexpr iterator emplace(const_iterator position, Args&&... args); template<container-compatible-range R> constexpr void append_range(R&& rg); `

1

#

Let n be the value of size() before this call for the append_range overload, anddistance(begin, position) otherwise.

2

#

Complexity: Linear in the number of elements inserted plus the distance to the end of the vector.

3

#

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.

Otherwise, if an exception is thrown, thensize() ≥ n and elements in the range begin() + [0, n) are not modified.

🔗

constexpr reference push_back(const T& x); constexpr reference push_back(T&& x); template<class... Args> constexpr reference emplace_back(Args&&... args);

4

#

Returns: back().

5

#

Throws: bad_alloc or any exception thrown by the initialization of the inserted element.

6

#

Complexity: Constant.

7

#

Remarks: If an exception is thrown, there are no effects on *this.

🔗

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

#

Let vals denote a pack:

std::forward(args)... for the first overload,

x for the second overload,

std::move(x) for the third overload.

9

#

Preconditions: value_type is Cpp17EmplaceConstructible into inplace_vector from vals....

10

#

Effects: If size() < capacity() is true, appends an object of type T direct-non-list-initialized with vals....

Otherwise, there are no effects.

11

#

Returns: nullptr if size() == capacity() is true, otherwise addressof(back()).

12

#

Throws: Nothing unless an exception is thrown by the initialization of the inserted element.

13

#

Complexity: Constant.

14

#

Remarks: If an exception is thrown, there are no effects on *this.

🔗

template<[container-compatible-range](container.intro.reqmts#concept:container-compatible-range "23.2.2.1Introduction[container.intro.reqmts]")<T> R> constexpr ranges::borrowed_iterator_t<R> try_append_range(R&& rg);

15

#

Preconditions: value_type is Cpp17EmplaceConstructible into inplace_vector from

*ranges::begin(rg).

16

#

Effects: Appends copies of initial elements in rg before end(), until all elements are inserted or size() == capacity() is true.

Each iterator in the range rg is dereferenced at most once.

17

#

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.

18

#

Complexity: Linear in the number of elements inserted.

19

#

Remarks: Let n be the value of size() prior to this call.

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.

🔗

template<class... Args> constexpr reference unchecked_emplace_back(Args&&... args);

20

#

Preconditions: size() < capacity() is true.

21

#

Effects: Equivalent to:return *try_emplace_back(std::forward(args)...);

🔗

constexpr reference unchecked_push_back(const T& x); constexpr reference unchecked_push_back(T&& x);

22

#

Preconditions: size() < capacity() is true.

23

#

Effects: Equivalent to:return *try_push_back(std::forward<decltype(x)>(x));

🔗

constexpr iterator erase(const_iterator position); constexpr iterator erase(const_iterator first, const_iterator last); constexpr void pop_back();

24

#

Effects: Invalidates iterators and references at or after the point of the erase.

25

#

Throws: Nothing unless an exception is thrown by the assignment operator or move assignment operator of T.

26

#

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.

23.3.16.6 Erasure [inplace.vector.erasure]

🔗

template<class T, size_t N, class U = T> constexpr size_t erase(inplace_vector<T, N>& c, const U& value);

1

#

Effects: Equivalent to:auto it = remove(c.begin(), c.end(), value);auto r = distance(it, c.end()); c.erase(it, c.end());return r;

🔗

template<class T, size_t N, class Predicate> constexpr size_t erase_if(inplace_vector<T, N>& c, Predicate pred);

2

#

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;