Chuyển tới nội dung chính

std::vector::operator=

#include <vector>

vector& operator=(const vector& other);

vector& operator=(vector&& other) noexcept;

vector& operator= (initializer_list<value_type> il);

Toán tử gán = cho phép sao chép hoặc di chuyển nội dung của một std::vector sang một std::vector khác.

Tham số

const vector& other

  • Tham chiếu tới vector nguồn mà bạn muốn sao chép các phần tử từ đó.

vector&& other

  • Tham chiếu rvalue tới vector nguồn mà bạn muốn chuyển các phần tử từ đó.

il

  • Một đối tượng std::initializer_list<value_type> đại diện cho danh sách các giá trị kiểu value_type.
  • Danh sách khởi tạo phải cùng kiểu <value_type> với vector.

Giá trị trả về

  • Trả về một tham chiếu (vector&) đến chính vector đích sau khi gán.

Đặc điểm

  1. Tự động quản lý bộ nhớ: vector nguồn và vector đích đều đảm bảo quản lý bộ nhớ đúng cách, không gây rò rỉ bộ nhớ.
  2. Hỗ trợ gán bằng sao chép: Tạo một bản sao sâu (deep copy) của vector nguồn.
  3. Hỗ trợ gán bằng di chuyển: Tăng hiệu năng bằng cách tái sử dụng tài nguyên từ vector nguồn khi sử dụng gán bằng di chuyển (move assignment).
  4. Ưu điểm:
    • Sao chép:
      • An toàn khi bạn muốn tạo bản sao của vector mà không làm thay đổi vector nguồn.
      • Đảm bảo rằng vector nguồn vẫn giữ nguyên các phần tử sau khi gán.
    • Di chuyển:
      • Hiệu suất cao, không cần phải sao chép từng phần tử mà chỉ chuyển quyền sở hữu.
      • Hữu ích khi bạn không còn cần sử dụng vector nguồn sau khi gán.
  5. Sau khi di chuyển (move), vector nguồn thường có trạng thái hợp lệ nhưng không xác định (thường là rỗng).
  6. Nếu vector đích đã chứa dữ liệu, bộ nhớ sẽ được giải phóng trước khi gán.
  7. Nếu bạn chỉ quan tâm hiệu năng, hãy ưu tiên gán bằng di chuyển thay vì sao chép.

Ví dụ

Gán bằng sao chép (copy assignment)

#include <iostream>
#include <vector>

int main() {
std::vector<int> vec1 = {1, 2, 3};
std::vector<int> vec2;

vec2 = vec1; // Gán bằng sao chép

for (int val : vec2) {
std::cout << val << " ";
}
return 0;
}

Gán bằng di chuyển (move assignment)

#include <iostream>
#include <vector>

int main() {
std::vector<int> vec1 = {1, 2, 3};
std::vector<int> vec2;

vec2 = std::move(vec1); // Gán bằng di chuyển

std::cout << "vec2: ";
for (int val : vec2) {
std::cout << val << " ";
}
std::cout << "\nvec1 size: " << vec1.size(); // vec1 giờ rỗng

return 0;
}

Gán trong một hàm

#include <iostream>
#include <vector>

std::vector<int> createVector() {
return {4, 5, 6};
}

int main() {
std::vector<int> vec = {1, 2, 3};
vec = createVector(); // Gán bằng di chuyển do createVector trả về rvalue

for (int val : vec) {
std::cout << val << " ";
}
return 0;
}

Gán trực tiếp một danh sách khởi tạo vào vector

#include <iostream>
#include <vector>

int main() {
std::vector<int> vec;

vec = {1, 2, 3, 4, 5}; // Gán bằng danh sách khởi tạo

for (int val : vec) {
std::cout << val << " ";
}

return 0;
}

Các hàm liên quan

assignGán giá trị mới cho các phần tử trong vector