C++ STL의 unordered_multimap에서 제공하는 rehash(n) 함수는 해시 테이블의 버킷(bucket) 개수를 n개 이상으로 설정하는 기능을 합니다. 이 함수를 적절히 활용하면 데이터를 대량으로 삽입하기 전에 해시 충돌을 줄여 컨테이너의 성능을 미리 최적화할 수 있습니다.
rehash() 함수의 동작 원리
rehash(n)은 매개변수로 전달된 값 n을 기준으로 컨테이너 해시 테이블의 최소 버킷 개수를 지정합니다. 구체적인 동작 방식은 다음과 같습니다.
- n이 현재 버킷 개수보다 크면 리해시(rehash)가 강제로 발생하며, 새로운 버킷 개수는 n과 같거나 그보다 큰 값으로 설정됩니다.
- n이 현재 버킷 개수보다 작거나 같으면 버킷 개수에는 아무런 변화가 없으며, 리해시도 강제되지 않습니다.
- 함수는 반환값이 없습니다(void).
동작 알고리즘
Begin
빈 맵(map) 컨테이너 m을 선언한다.
rehash() 함수를 호출하여 컨테이너의 버킷 개수가
최소한 일정 수치 이상을 유지하도록 강제한다.
최소 버킷 개수와 같거나 그 이상의 키-값 쌍을 컨테이너에 삽입한다.
맵 컨테이너의 요소들을 출력한다.
End.
예제 코드
#include<iostream>
#include <bits/stdc++.h>
using namespace std;
int main() {
unordered_map<char, int> m;
m.rehash(1);
m.insert (pair<char, int>('b', 10));
m.insert (pair<char, int>('a', 20));
cout << "The size is: " << m.size();
cout << "\nKey and values are: ";
for (auto it = m.begin(); it != m.end(); it++) {
cout << "{" << it->first << ", " << it->second << "} ";
}
return 0;
}
실행 결과
The size is: 2
Key and values are: {a, 20} {b, 10}
위 코드에서는 m.rehash(1)을 호출해 컨테이너가 최소 1개의 버킷을 갖도록 설정했습니다. 이후 두 개의 키-값 쌍을 삽입하자 컨테이너 크기가 2가 되었고, 모든 요소가 정상적으로 출력되는 것을 확인할 수 있습니다.
참고 사항
예제에서는 unordered_map을 사용했지만, rehash() 함수는 unordered_set, unordered_map, unordered_multiset, unordered_multimap 등 모든 비정렬 연관 컨테이너에서 동일하게 동작합니다. 또한 실제 재해시 시점은 max_load_factor(최대 적재율)에 따라 달라질 수 있으며, 요소 개수 기준으로 버킷을 확보하고 싶다면 reserve() 함수를 사용하는 것도 좋은 방법입니다.