Przestrzenie nazw
Warianty
Działania

std::vector::operator=

Z cppreference.com
< cpp‎ | container‎ | vector
vector& operator=( const vector& other );
(1)
(2)
vector& operator=( vector&& other );
(od C++11)
vector& operator=( std::initializer_list<T> ilist );
(3) (od C++11)

Zastępuje zawartość kontenera.

1) Operator przypisania przez kopiowanie. Zastępuje zawartość kontenera kopią zawartości other.Jeśli std::allocator_traits<allocator_type>::propagate_on_container_copy_assignment::value to true, alokator docelowy jest zastępowany kopią alokatora źródłowego. Jeśli nie są one sobie równe, alokator (*this) jest użyty do dealokacji pamięci, a następnie alokator other jest użyty do zaalokowania pamięci przed skopiowaniem elementów. (od C++11).
2) Operator przypisania przez przeniesienie. Zastępuje zawartość kontenera zawartością other, używając semantyki move (tj. dane z other są przeniesione z other do tego kontenera). other jest po tej operacji w poprawnym, ale niesprecyzowanym stanie. Jeśli std::allocator_traits<allocator_type>::propagate_on_container_move_assignment::value to true, alokator docelowy jest zastępowany kopią alokatora źródłowego. Jeśli jednak to false a alokator docelowy i źródłowy nie są identyczne, kontener docelowy nie może przejąć na własność pamięci kontenera źródłowego, przez co jest zmuszony >przypisać przez przeniesienie< każdy z elementów osobno, alokując w razie potrzeby dodatkową pamięć korzystając z własnego alokatora. W dowolnym przypadku, elementy początkowo obecne w *this są albo niszczone, albo replaced by elementwise move-assignment(wymaga tłumaczenia).
3) Zastępuje zawartość kontenera zawartością utożsamianą przez listę inicjalizacyjną ilist.

Spis treści

[edytuj] Parametry

other - inny kontener, wykorzystany jako źródło danych
ilist - lista inicjalizacyjna, wykorzystana jako źródło danych

[edytuj] Zwracana wartość

*this

[edytuj] Złożoność

1) Liniowa względem rozmiaru *this i other.
2) Liniowa względem rozmiaru *this chyba, że alokatory nie są równe i nie propagują, w którym to wypadku liniowa względem rozmiaru *this i other
3) Liniowa względem rozmiaru *this i ilist.

[edytuj] Notka

After container move assignment (overload (2)), unless elementwise 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 §23.2.1[container.requirements.general]/12, and a more direct guarantee is under consideration via LWG 2321.

[edytuj] Przykład

Poniższy kod wykorzystuje operator= aby przypisać zawartość jednego kontenera std::vector do drugiego:

#include <vector>
#include <iostream>
 
void display_sizes(const std::vector<int>& nums1,
                   const std::vector<int>& nums2,
                   const std::vector<int>& nums3)
{
    std::cout << "nums1: " << nums1.size() 
              << " nums2: " << nums2.size()
              << " nums3: " << nums3.size() << '\n';
}
 
int main()
{
    std::vector<int> nums1 {3, 1, 4, 6, 5, 9};
    std::vector<int> nums2; 
    std::vector<int> nums3;
 
    std::cout << "Initially:\n";
    display_sizes(nums1, nums2, nums3);
 
    // Przypisanie przez kopiowanie, kopiuje dane z nums1 do nums2
    nums2 = nums1;
 
    std::cout << "After assigment:\n"; 
    display_sizes(nums1, nums2, nums3);
 
    // Przypisanie przez przeniesienie, przenosi dane z nums1 do nums3,
    // Zarówno nums1 jak i nums3 zostają zmodyfikowane
    nums3 = std::move(nums1);
 
    std::cout << "After move assigment:\n"; 
    display_sizes(nums1, nums2, nums3);
}

Wynik:

Initially:
nums1: 6 nums2: 0 nums3: 0
After assigment:
nums1: 6 nums2: 6 nums3: 0
After move assigment:
nums1: 0 nums2: 6 nums3: 6

[edytuj] Zobacz także

Konstruuje vector
(publiczna metoda) [edit]
przypisuje wartości do kontenera
(publiczna metoda) [edit]