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,swaptương tự.unordered_multimap: cho phép khóa trùng,swaphoá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.