std::unordered_multiset::operator=
#include <unordered_set>
// 1. Copy assignment operator
unordered_multiset& operator=(const unordered_multiset& other);
// 2. Move assignment operator (C++11)
unordered_multiset& operator=(unordered_multiset&& other);
// 3. Initializer list assignment operator (C++11)
unordered_multiset& operator=(initializer_list<value_type> ilist);
Gán nội dung của một std::unordered_multiset khác hoặc một initializer_list cho std::unordered_multiset hiện tại.
Tham số
other
- std::unordered_multiset nguồn cần gán (Phiên bản 1 và 2).
ilist
- Danh sách khởi tạo chứa các phần tử cần gán (Phiên bản 3).
Giá trị trả về
unordered_multiset&
- Tham chiếu đến std::unordered_multiset hiện tại (sau khi đã gán).
Đặc điểm
- Thay thế nội dung: Các toán tử gán thay thế toàn bộ nội dung hiện tại của std::unordered_multiset bằng nội dung mới.
- Copy vs. Move:
- Copy assignment tạo một bản sao độc lập của std::unordered_multiset nguồn.
- Move assignment di chuyển tài nguyên (dữ liệu) từ std::unordered_multiset nguồn sang std::unordered_multiset đích, làm cho std::unordered_multiset nguồn trở thành rỗng, hiệu quả hơn sao chép.
- Initializer list: Phiên bản gán từ danh sách khởi tạo cung cấp cách thức tiện lợi để gán các giá trị cố định cho std::unordered_multiset.
- Tự gán (self-assignment): Toán tử
operator=
được cài đặt để tự phát hiện và xử lý đúng các trường hợp tự gána = a;
- An toàn exception: Nếu exception xảy ra trong khi copy assignment đang copy các phần tử, unordered_multiset đích sẽ không thay đổi. Nếu exception xảy ra khi move assignment đang move các phần tử, thì unordered_multiset nguồn vẫn hợp lệ nhưng trạng thái không xác định.
- noexcept: Move assignment operator được đánh dấu là
noexcept
, nghĩa là nó được đảm bảo không ném ra ngoại lệ nào. - Độ phức tạp:
- Copy assignment: Độ phức tạp tuyến tính theo kích thước của std::unordered_multiset nguồn (
O(n)
). - Move assignment: Độ phức tạp thường là hằng số (
O(1)
). - Initializer list assignment: Độ phức tạp tuyến tính theo kích thước của danh sách khởi tạo (
O(n)
).
- Copy assignment: Độ phức tạp tuyến tính theo kích thước của std::unordered_multiset nguồn (
Ví dụ
#include <iostream>
#include <unordered_set>
int main() {
std::unordered_multiset<int> umset1 = {1, 2, 3, 3, 2};
std::unordered_multiset<int> umset2 = {4, 5, 4};
std::unordered_multiset<int> umset3;
// 1. Copy assignment
umset3 = umset1;
std::cout << "umset3 after copy assignment from umset1:";
for (int x : umset3) std::cout << ' ' << x; // Output: umset3 after copy assignment from umset1: 1 2 3 3 2 (thứ tự có thể khác)
std::cout << '\n';
// 2. Move assignment
umset3 = std::move(umset2);
std::cout << "umset3 after move assignment from umset2:";
for (int x : umset3) std::cout << ' ' << x; // Output: umset3 after move assignment from umset2: 4 5 4 (thứ tự có thể khác)
std::cout << '\n';
std::cout << "umset2 after move assignment:";
for (int x : umset2) std::cout << ' ' << x; // Output: umset2 after move assignment: (empty)
std::cout << '\n';
// 3. Initializer list assignment
umset3 = {7, 8, 9, 10, 8, 8};
std::cout << "umset3 after initializer list assignment:";
for (int x : umset3) std::cout << ' ' << x; // Output: umset3 after initializer list assignment: 7 8 8 9 10 (thứ tự có thể khác)
std::cout << '\n';
return 0;
}
Các hàm liên quan
emplace | Xây dựng (construct) một phần tử mới trực tiếp trong std::unordered_multiset |