C++ STL에서 unordered_multimap의 reserve() 함수는 컨테이너가 최소 n개의 요소를 저장할 수 있도록 버킷(bucket)의 개수를 가장 적절한 값으로 설정합니다.
요청한 개수 n이 현재 버킷 수에 max_load_factor를 곱한 값보다 클 경우, 컨테이너는 버킷 수를 늘리고 재해시(rehash)를 강제로 수행합니다.
reserve() 함수는 아무 값도 반환하지 않으며, 요청하는 최소 용량을 나타내는 매개변수 n 하나만 받습니다.
알고리즘
시작
맵 컨테이너 m을 선언한다.
m.reserve(6): 최소 6개의 요소를 담을 수 있도록 버킷 공간을 미리 확보한다.
키-값 쌍을 삽입한다.
결과를 출력한다.
종료예제 코드
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
int main() {
unordered_multimap<char, int> m; // m을 맵 컨테이너로 선언
m.reserve(6); // 최소 6개의 요소를 담기에 적절한 버킷 수로 조정
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}reserve() 함수 핵심 정리
- 반환값: 없음(void 타입)
- 매개변수: n — 확보하려는 최소 요소 수
- 재해시 조건: n이 bucket_count() × max_load_factor보다 클 때 재해시 발생
- 장점: 대량의 데이터를 삽입하기 전에 호출하면 재해시로 인한 성능 저하를 방지할 수 있습니다.
참고 사항
- 재해시가 발생하면 기존의 모든 반복자(iterator)는 무효화되지만, 요소를 가리키는 참조와 포인터는 유효성이 유지됩니다.
- reserve(n)은 내부적으로 rehash(ceil(n / max_load_factor))와 동일하게 동작합니다.
- 버킷 수를 직접 지정하고 싶다면 rehash(n) 함수를 사용할 수 있습니다.