Difference between revisions of "cpp/container/vector/operator="
(Created page with "{{cpp/container/operator{{=}}|vector}}") |
m (1 revision: import content) |
Revision as of 14:45, 6 June 2011
vector& operator=( const vector& other ); |
(1) | (constexpr since C++20) |
(2) | ||
vector& operator=( vector&& other ); |
(since C++11) (until C++17) |
|
vector& operator=( vector&& other ) noexcept(/* see below */); |
(since C++17) | |
vector& operator=( std::initializer_list<value_type> ilist ); |
(3) | (since C++11) (constexpr since C++20) |
Replaces the contents of the container.
If std::allocator_traits<allocator_type>::propagate_on_container_copy_assignment::value is true, the allocator of *this is replaced by a copy of other. If the allocator of *this after assignment would compare unequal to its old value, the old allocator is used to deallocate the memory, then the new allocator is used to allocate it before copying the elements. Otherwise, the memory owned by *this may be reused when possible. In any case, the elements originally belonging to *this may be either destroyed or replaced by element-wise copy-assignment. |
(since C++11) |
Contents |
Parameters
other | - | another container to use as data source |
ilist | - | initializer list to use as data source |
Return value
*this
Complexity
Exceptions
1-3) May throw implementation-defined exceptions.
|
(until C++17) |
1,3) May throw implementation-defined exceptions.
2) noexcept specification:
noexcept(std::allocator_traits<Allocator>::propagate_on_container_move_assignment::value || std::allocator_traits<Allocator>::is_always_equal::value) |
(since C++17) |
Notes
After container move assignment (overload (2)), unless element-wise move assignment is forced by incompatible allocators, references, pointers, and iterators (other than the end iterator) to other
remain valid, but refer to elements that are now in *this. The current standard makes this guarantee via the blanket statement in [container.reqmts]/67, and a more direct guarantee is under consideration via LWG issue 2321.
Example
The following code uses operator= to assign one std::vector to another:
#include <initializer_list> #include <iostream> #include <iterator> #include <vector> void print(auto const comment, auto const& container) { auto size = std::size(container); std::cout << comment << "{ "; for (auto const& element : container) std::cout << element << (--size ? ", " : " "); std::cout << "}\n"; } int main() { std::vector<int> x{1, 2, 3}, y, z; const auto w = {4, 5, 6, 7}; std::cout << "Initially:\n"; print("x = ", x); print("y = ", y); print("z = ", z); std::cout << "Copy assignment copies data from x to y:\n"; y = x; print("x = ", x); print("y = ", y); std::cout << "Move assignment moves data from x to z, modifying both x and z:\n"; z = std::move(x); print("x = ", x); print("z = ", z); std::cout << "Assignment of initializer_list w to z:\n"; z = w; print("w = ", w); print("z = ", z); }
Output:
Initially: x = { 1, 2, 3 } y = { } z = { } Copy assignment copies data from x to y: x = { 1, 2, 3 } y = { 1, 2, 3 } Move assignment moves data from x to z, modifying both x and z: x = { } z = { 1, 2, 3 } Assignment of initializer_list w to z: w = { 4, 5, 6, 7 } z = { 4, 5, 6, 7 }
See also
constructs the vector (public member function) | |
assigns values to the container (public member function) |