std::vector<T,Allocator>::append_range
constexpr void append_range( R&& rg );
Inserts copies of elements from the range rg before end()
, in non-reversing order.
If after the operation the new size()
is greater than old capacity()
a reallocation takes place, in which case all iterators (including the end()
iterator) and all references to the elements are invalidated. Otherwise only the end()
iterator is invalidated.
Each iterator in rg is dereferenced exactly once.
[edit] Parameters
-
T
is not EmplaceConstructible intovector
from *ranges::begin (rg). -
T
is not MoveInsertable intovector
.
-
[edit] 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()
.
If one of the following conditions is satisfied, performs at most one reallocation:
-
R
models approximately_sized_range and ranges::distance (rg) <= ranges::reserve_hint(rg) is true. -
R
modelsforward_range
andR
does not model approximately_sized_range.
[edit] Exceptions
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. If an exception is thrown while inserting a single element at the end and T
is CopyInsertable or std::is_nothrow_move_constructible_v <T>
is true, there are no effects. Otherwise, if an exception is thrown by the move constructor of a non-CopyInsertable T
, the effects are unspecified.
Notes
Feature-test macro | Value | Std | Feature |
---|---|---|---|
__cpp_lib_containers_ranges |
202202L |
(C++23) | Ranges-aware construction and insertion |
[edit] Example
#include <cassert> #include <vector> #include <list> int main() { auto head = std::vector {1, 2, 3, 4}; const auto tail = std::list {-5, -6, -7}; #ifdef __cpp_lib_containers_ranges head.append_range(tail); #else head.insert(head.end(), tail.cbegin(), tail.cend()); #endif assert ((head == std::vector {1, 2, 3, 4, -5, -6, -7})); }