Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

C++ STL unordered_multimap의 reserve() 함수 사용법과 예제

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) 함수를 사용할 수 있습니다.