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

std::unordered_map::operator=

#include <unordered_map>

// 1. Copy assignment operator
unordered_map& operator=(const unordered_map& other);

// 2. Move assignment operator (C++11)
unordered_map& operator=(unordered_map&& other) noexcept;

// 3. Initializer list assignment operator (C++11)
unordered_map& operator=(initializer_list<value_type> ilist);

Gán nội dung của một std::unordered_map khác hoặc một initializer_list cho std::unordered_map hiện tại.

Tham số

other

  • (Phiên bản 1 và 2) std::unordered_map nguồn cần gán.

ilist

  • (Phiên bản 3) Danh sách khởi tạo chứa các phần tử cần gán (các phần tử có kiểu std::pair).

Giá trị trả về

unordered_map&

  • Tham chiếu đến std::unordered_map hiện tại (sau khi đã gán).

Đặc điểm

  1. 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_map bằng nội dung mới.
  2. Copy vs. Move:
    • Copy assignment tạo một bản sao độc lập của std::unordered_map nguồn.
    • Move assignment di chuyển tài nguyên (dữ liệu) từ std::unordered_map nguồn sang std::unordered_map đích, làm cho std::unordered_map nguồn trở thành rỗng, hiệu quả hơn sao chép.
  3. 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_map.
  4. 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án a = a;
  5. An toàn exception: Nếu exception xảy ra trong khi copy assignment đang copy các phần tử, unordered_map đích sẽ không thay đổi. Nếu exception xảy ra khi move assignment đang move các phần tử, thì unordered_map nguồn vẫn hợp lệ nhưng trạng thái không xác định.
  6. 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.
  7. Làm thay đổi iterator: Toán tử gán làm thay đổi (invalidate) các iterator đang trỏ đến std::unordered_map.
  8. Độ phức tạp:
    • Copy assignment: Độ phức tạp tuyến tính theo kích thước của std::unordered_map 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)).

Ví dụ

#include <iostream>
#include <unordered_map>
#include <string>

int main() {
std::unordered_map<std::string, int> umap1 = {{"apple", 1}, {"banana", 2}, {"orange", 3}};
std::unordered_map<std::string, int> umap2 = {{"grape", 4}, {"kiwi", 5}};
std::unordered_map<std::string, int> umap3;

// 1. Copy assignment
umap3 = umap1;
std::cout << "umap3 after copy assignment from umap1:\n";
for (const auto& pair : umap3) {
std::cout << pair.first << ": " << pair.second << '\n';
}
// Output:
// umap3 after copy assignment from umap1:
// (thứ tự các phần tử có thể khác)
// apple: 1
// banana: 2
// orange: 3

// 2. Move assignment
umap3 = std::move(umap2);
std::cout << "umap3 after move assignment from umap2:\n";
for (const auto& pair : umap3) {
std::cout << pair.first << ": " << pair.second << '\n';
}
// Output:
// umap3 after move assignment from umap2:
// grape: 4
// kiwi: 5 (thứ tự có thể khác)

std::cout << "umap2 after move assignment:\n";
for (const auto& pair : umap2) {
std::cout << pair.first << ": " << pair.second << '\n';
}
// Output:
// umap2 after move assignment:
// (empty)

// 3. Initializer list assignment
umap3 = {{"pear", 6}, {"mango", 7}, {"pear", 8}}; // Key "pear" bị ghi đè
std::cout << "umap3 after initializer list assignment:\n";
for (const auto& pair : umap3) {
std::cout << pair.first << ": " << pair.second << '\n';
}
// Output:
// umap3 after initializer list assignment:
// mango: 7
// pear: 8 (thứ tự có thể khác)

return 0;
}

Các hàm liên quan

emplaceXây dựng (construct) một phần tử mới (cặp key-value) trực tiếp trong std::unordered_map tại vị trí thích hợp