std::vector<T,Allocator>::operator=
| vector& operator=( const vector& other ); |
(1) | (constexpr seit C++20) |
| (2) | ||
vector& operator=( vector&& other ); |
(seit C++11) (bis C++17) |
|
| vector& operator=( vector&& other ) noexcept(/* siehe unten */); |
(seit C++17) | |
| vector& operator=( std::initializer_list<value_type> ilist ); |
(3) | (seit C++11) (constexpr seit C++20) |
Ersetzt den Inhalt des Containers.
|
Wenn std::allocator_traits<allocator_type>::propagate_on_container_copy_assignment::value true ist, wird der Allocator von *this durch eine Kopie von other ersetzt. Wenn der Allocator von *this nach der Zuweisung ungleich seinem alten Wert wäre, wird der alte Allocator zum Freigeben des Speichers verwendet, dann wird der neue Allocator zum Allokieren vor dem Kopieren der Elemente verwendet. Andernfalls kann der von *this besessene Speicher wiederverwendet werden, wo immer möglich. In jedem Fall können die ursprünglich zu *this gehörenden Elemente entweder zerstört oder durch elementweise Kopierzuweisung ersetzt werden. |
(seit C++11) |
Inhalt |
[bearbeiten] Parameter
| Sonstiges | - | ein weiterer Container, der als Datenquelle dient |
| ilist | - | Initialisierungsliste, die als Datenquelle dient |
[bearbeiten] Rückgabewert
*this
[bearbeiten] Komplexität
[bearbeiten] Ausnahmen
|
1-3) Kann Implementierungs-definierte Ausnahmen auslösen. |
(bis C++17) |
|
1,3) Kann implementierungsdefinierte Ausnahmen auslösen.
2) noexcept-Spezifikation:
noexcept(std::allocator_traits<Allocator>::propagate_on_container_move_assignment::value || std::allocator_traits<Allocator>::is_always_equal::value) |
(seit C++17) |
[bearbeiten] Hinweise
Nach der Container-Move-Zuweisung (Überladung (2)), es sei denn, die elementweise Move-Zuweisung wird durch inkompatible Allokatoren erzwungen, bleiben Referenzen, Zeiger und Iteratoren (außer dem End-Iterator) zu other gültig, verweisen aber auf Elemente, die sich jetzt in *this befinden. Der aktuelle Standard macht diese Garantie durch die allgemeine Aussage in [container.reqmts]/67 und eine direktere Garantie wird durch LWG issue 2321 in Betracht gezogen.
[bearbeiten] Beispiel
Der folgende Code verwendet operator=, um einen std::vector einem anderen zuzuweisen
#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); }
Ausgabe
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 }[bearbeiten] Siehe auch
konstruiert den vector(public member function) | |
| weist dem Container Werte zu (public member function) |