Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> C++

Hàm unordered_multimap::swap() trong C++ STL

unordered_multimap::swap() trao đổi toàn bộ nội dung giữa hai container unordered_multimap cùng kiểu trong thời gian không đổi O(1) – chỉ hoán đổi con trỏ nội bộ, không copy/move phần tử.

Đặc điểm

  • C++11: void swap(unordered_multimap& other).
  • Không ném exception (noexcept).
  • Iterator, pointer, reference đến phần tử vẫn hợp lệ sau swap (chỉ đổi chủ sở hữu).
  • Yêu cầu: cùng kiểu (Key, T, Hash, KeyEqual, Allocator) – hoặc allocator compatible (C++17).

Ví dụ

#include <iostream>
#include <unordered_map>
#include <string>
using namespace std;

int main() {
    unordered_multimap<char, int> m1, m2;

    m1.emplace('b', 10);
    m1.emplace('c', 30);
    m1.emplace('d', 40);

    m2.emplace('a', 20);
    m2.emplace('e', 70);
    m2.emplace('f', 60);

    cout << "Before swap:\n";
    cout << "m1: "; for (auto& p : m1) cout << "{" << p.first << "," << p.second << "} ";
    cout << "\nm2: "; for (auto& p : m2) cout << "{" << p.first << "," << p.second << "} ";
    cout << endl;

    m1.swap(m2); // O(1)

    cout << "After swap:\n";
    cout << "m1: "; for (auto& p : m1) cout << "{" << p.first << "," << p.second << "} ";
    cout << "\nm2: "; for (auto& p : m2) cout << "{" << p.first << "," << p.second << "} ";
    cout << endl;

    return 0;
}

Kết quả

Before swap:
m1: {b,10} {c,30} {d,40}
m2: {a,20} {e,70} {f,60}

After swap:
m1: {a,20} {e,70} {f,60}
m2: {b,10} {c,30} {d,40}

Hàm non-member std::swap

C++ cung cấp std::swap(m1, m2) – gọi m1.swap(m2) bên trong. Khuyến nghị dùng std::swap cho generic code.

So sánh với unordered_map

  • unordered_map: khóa duy nhất, swap tương tự.
  • unordered_multimap: cho phép khóa trùng, swap hoán đổi toàn bộ bucket array.

Khi nào dùng swap?

  • Clear nhanh container lớn: unordered_multimap<K,V>().swap(m); (swap với temporary rỗng).
  • Implement move assignment hiệu quả.
  • Hoán đổi buffer double-buffering.