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ểuvalue_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
- 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ớ.
- 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.
- 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).
- Ư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.
- Sao chép:
- 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).
- Nếu vector đích đã chứa dữ liệu, bộ nhớ sẽ được giải phóng trước khi gán.
- 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
assign | Gán giá trị mới cho các phần tử trong vector |