C++ STL의 unordered_multimap swap() 함수는 크기와 타입이 같은 두 컨테이너 사이에서 요소들을 서로 맞바꾸는 데 사용됩니다. 이 함수를 호출하면 한 컨테이너의 모든 요소가 다른 컨테이너로 이동하고, 그 반대 역시 동시에 이루어집니다. unordered_map과 unordered_multimap 모두 동일한 방식으로 swap()을 지원합니다.
swap() 함수의 주요 특징
- 두 컨테이너의 내용 전체를 한 번에 교환합니다.
- 내부적으로 해시 테이블 구조 자체를 맞바꾸므로 시간 복잡도는 상수 시간 O(1)로 매우 효율적입니다.
- swap 이후에도 기존 반복자(iterator), 참조(reference), 포인터는 유효하며, 이제 반대편 컨테이너의 요소를 가리키게 됩니다.
알고리즘
시작
빈 맵 컨테이너 m, m1을 선언한다.
m, m1 컨테이너에 각각 값을 삽입한다.
swap() 함수를 호출하여 m과 m1의 값을 교환한다.
교환된 m 컨테이너의 값을 출력한다.
교환된 m1 컨테이너의 값을 출력한다.
끝.예제 코드
#include<iostream>
#include <bits/stdc++.h>
using namespace std;
int main() {
unordered_map<char, int> m, m1; // m, m1을 빈 맵 컨테이너로 선언
m.insert(pair<char, int>('b', 10)); // 맵 컨테이너에 값 삽입
m.insert(pair<char, int>('c', 30));
m.insert(pair<char, int>('d', 40));
m1.insert(pair<char, int>('a', 20));
m1.insert(pair<char, int>('e', 70));
m1.insert(pair<char, int>('f', 60));
m.swap(m1); // 두 맵 컨테이너의 값을 교환
cout << "\n 첫 번째 컨테이너의 키와 값:";
for (auto it = m.begin(); it != m.end(); it++) {
cout << "{" << it->first << ", " << it->second << "} "; // 교환된 m의 값 출력
}
cout << "\n 두 번째 컨테이너의 키와 값:"; // 교환된 m1의 값 출력
for (auto it = m1.begin(); it != m1.end(); it++) {
cout << "{" << it->first << ", " << it->second << "} ";
}
return 0;
}실행 결과
첫 번째 컨테이너의 키와 값: {f, 60} {a, 20} {e, 70}
두 번째 컨테이너의 키와 값: {d, 40} {b, 10} {c, 30}.위 실행 결과에서 볼 수 있듯이, swap() 호출 이후 m에는 원래 m1에 있던 {a, 20}, {e, 70}, {f, 60}이 들어가고, m1에는 원래 m에 있던 {b, 10}, {c, 30}, {d, 40}이 들어갑니다. unordered 컨테이너는 해시 기반으로 저장되기 때문에 출력 순서는 실행 환경에 따라 달라질 수 있습니다.
정리
unordered_multimap의 swap() 멤버 함수는 요소를 하나씩 복사하는 대신 컨테이너의 내부 구조를 통째로 맞바꾸기 때문에 매우 빠릅니다. 대용량 데이터를 다룰 때 임시 객체나 복사 비용 없이 두 컨테이너의 내용을 즉시 교환해야 하는 경우에 유용하게 활용할 수 있습니다.