Namespaces
Variants

std:: unordered_map

From cppreference.net
헤더 파일에 정의됨 <unordered_map>
template <

class Key,
class T,
class Hash = std:: hash < Key > ,
class KeyEqual = std:: equal_to < Key > ,
class Allocator = std:: allocator < std:: pair < const Key, T >>

> class unordered_map ;
(1) (C++11부터)
namespace pmr {

template <
class Key,
class T,
class Hash = std:: hash < Key > ,
class KeyEqual = std:: equal_to < Key >
> using unordered_map =
std :: unordered_map < Key, T, Hash, KeyEqual,
std:: pmr :: polymorphic_allocator < std:: pair < const Key, T >>> ;

}
(2) (C++17부터)

std::unordered_map 는 고유 키를 가진 키-값 쌍을 포함하는 연관 컨테이너입니다. 요소의 검색, 삽입 및 제거는 평균 상수 시간 복잡도를 가집니다.

내부적으로 요소들은 특정 순서로 정렬되지 않고 버킷으로 구성됩니다. 요소가 어떤 버킷에 배치되는지는 전적으로 해당 키의 해시에 따라 결정됩니다. 동일한 해시 코드를 가진 키들은 동일한 버킷에 나타납니다. 이는 해시가 계산되면 해당 요소가 포함된 버킷을 참조하므로 개별 요소에 대한 빠른 접근을 가능하게 합니다.

두 키는 맵의 키 동등성 술어가 해당 키들에 대해 전달되었을 때 true를 반환하는 경우 동등한(equivalent) 것으로 간주됩니다. 두 키가 동등한 경우, 해시 함수는 두 키 모두에 대해 동일한 값을 반환해야 합니다.

std::unordered_map Container , AllocatorAwareContainer , UnorderedAssociativeContainer 요구 사항을 충족합니다.

std::unordered_map 의 모든 멤버 함수는 constexpr 입니다: 상수 표현식 평가에서 std::unordered_map 객체를 생성하고 사용하는 것이 가능합니다.

그러나 일반적으로 std::unordered_map 객체 자체는 constexpr 일 수 없습니다. 동적으로 할당된 저장 공간은 동일한 상수 표현식 평가 내에서 해제되어야 하기 때문입니다.

(C++26부터)

목차

반복자 무효화

연산 무효화 여부
모든 읽기 전용 연산, swap , std::swap 절대 없음
clear , rehash , reserve , operator= 항상
insert , emplace , emplace_hint , operator[] 재해시가 발생하는 경우에만
erase 삭제된 요소에 대해서만

참고 사항

  • swap 함수들은 컨테이너 내부의 어떤 반복자도 무효화하지 않지만, swap 영역의 끝을 표시하는 반복자는 무효화합니다.
  • 컨테이너에 저장된 키나 데이터에 대한 참조와 포인터는 해당 반복자가 무효화되는 경우에도 해당 요소를 삭제할 때에만 무효화됩니다.

템플릿 매개변수

멤버 타입

타입 정의
key_type Key
mapped_type T
value_type std:: pair < const Key, T >
size_type 부호 없는 정수 타입 (일반적으로 std::size_t )
difference_type 부호 있는 정수 타입 (일반적으로 std::ptrdiff_t )
hasher Hash
key_equal KeyEqual
allocator_type Allocator
reference value_type &
const_reference const value_type &
pointer std:: allocator_traits < Allocator > :: pointer
const_pointer std:: allocator_traits < Allocator > :: const_pointer
iterator LegacyForwardIterator ConstexprIterator (C++26부터) 이며 value_type 을 가리키는 반복자
const_iterator LegacyForwardIterator ConstexprIterator (C++26부터) 이며 const value_type 을 가리키는 반복자
local_iterator 범주, 값, 차이, 포인터 및 참조 타입이 iterator 와 동일한 반복자 타입.
이 반복자는 단일 버킷 내에서는 순회할 수 있지만 버킷 간에는 순회할 수 없음
const_local_iterator 범주, 값, 차이, 포인터 및 참조 타입이 const_iterator 와 동일한 반복자 타입.
이 반복자는 단일 버킷 내에서는 순회할 수 있지만 버킷 간에는 순회할 수 없음
node_type (C++17부터) 컨테이너 노드를 나타내는 node handle 의 특수화
insert_return_type (C++17부터) node_type 삽입 결과를 설명하는 타입으로,

template < class Iter, class NodeType >
struct /*unspecified*/
{
Iter     position ;
bool inserted ;
NodeType node ;
} ;

템플릿 인자 iterator node_type 으로 인스턴스화된 특수화

멤버 함수

unordered_map 을 생성합니다
(public member function)
unordered_map 을 파괴합니다
(public member function)
컨테이너에 값을 할당합니다
(public member function)
연관된 할당자를 반환합니다
(public member function)
반복자
시작 부분에 대한 반복자를 반환합니다
(public member function)
끝을 가리키는 반복자를 반환합니다
(public member function)
용량
컨테이너가 비어 있는지 확인합니다
(public member function)
원소의 개수를 반환합니다
(public member function)
가능한 최대 요소 수를 반환합니다
(public member function)
수정자
내용을 지웁니다
(public member function)
요소를 삽입합니다 또는 노드 (C++17부터)
(public member function)
요소 범위를 삽입합니다
(public member function)
키가 이미 존재하는 경우 요소를 삽입하거나 현재 요소에 할당합니다
(public member function)
제자리에서 요소를 생성합니다
(public member function)
힌트를 사용하여 제자리에서 요소를 생성합니다
(public member function)
키가 존재하지 않으면 제자리에 삽입하고, 키가 존재하면 아무 작업도 수행하지 않음
(public member function)
요소를 삭제합니다
(public member function)
내용을 교환합니다
(public member function)
(C++17)
컨테이너로부터 노드를 추출합니다
(public member function)
(C++17)
다른 컨테이너의 노드를 연결
(public member function)
조회
범위 검사와 함께 지정된 요소에 접근
(public member function)
지정된 요소에 접근하거나 삽입
(public member function)
특정 키와 일치하는 요소의 수를 반환합니다
(public member function)
특정 키를 가진 요소를 찾습니다
(public member function)
(C++20)
특정 키를 가진 요소가 컨테이너에 포함되어 있는지 확인합니다
(public member function)
특정 키와 일치하는 요소들의 범위를 반환합니다
(public member function)
버킷 인터페이스
지정된 버킷의 시작 부분에 대한 반복자를 반환합니다
(public member function)
지정된 버킷의 끝을 가리키는 반복자를 반환합니다
(public member function)
버킷 수를 반환합니다
(public member function)
최대 버킷 수를 반환합니다
(public member function)
특정 버킷의 요소 수를 반환합니다
(public member function)
특정 키에 대한 버킷을 반환합니다
(public member function)
해시 정책
버킷당 평균 요소 수를 반환합니다
(public member function)
버킷당 최대 평균 요소 수를 관리합니다
(public member function)
지정된 수 이상의 버킷을 예약하고 해시 테이블을 재생성합니다
(public member function)
지정된 수의 요소에 대한 공간을 예약하고 해시 테이블을 재생성합니다
(public member function)
관찰자
키를 해시하는 데 사용되는 함수를 반환합니다
(public member function)
키 동등성 비교에 사용되는 함수를 반환합니다
(public member function)

비멤버 함수

(C++11) (C++11) (removed in C++20)
unordered_map의 값을 비교함
(함수 템플릿)
std::swap 알고리즘을 특수화함
(함수 템플릿)
특정 조건을 만족하는 모든 요소를 삭제함
(함수 템플릿)

추론 가이드

(C++17부터)

참고 사항

기능 테스트 매크로 표준 기능
__cpp_lib_containers_ranges 202202L (C++23) 컨테이너를 위한 범위 생성 및 삽입
__cpp_lib_constexpr_unordered_map 202502L (C++26) constexpr std::unordered_map

예제

#include <iostream>
#include <string>
#include <unordered_map>
int main()
{
    // 문자열에 매핑되는 세 개의 문자열 unordered_map 생성
    std::unordered_map<std::string, std::string> u =
    {
        {"RED", "#FF0000"},
        {"GREEN", "#00FF00"},
        {"BLUE", "#0000FF"}
    };
    // 키-값 쌍을 출력하는 헬퍼 람다 함수
    auto print_key_value = [](const auto& key, const auto& value)
    {
        std::cout << "Key:[" << key << "] Value:[" << value << "]\n";
    };
    std::cout << "unordered_map의 키-값 쌍을 반복하며 출력,\n"
                 "명시적 타입 지정:\n";
    for (const std::pair<const std::string, std::string>& n : u)
        print_key_value(n.first, n.second);
    std::cout << "\nC++17 구조적 바인딩을 사용하여 키-값 쌍 반복 및 출력:\n";
    for (const auto& [key, value] : u)
        print_key_value(key, value);
    // unordered_map에 두 개의 새 항목 추가
    u["BLACK"] = "#000000";
    u["WHITE"] = "#FFFFFF";
    std::cout << "\n키로 값 출력:\n"
                 "RED 색상의 HEX 값:[" << u["RED"] << "]\n"
                 "BLACK 색상의 HEX 값:[" << u["BLACK"] << "]\n\n";
    std::cout << "존재하지 않는 키로 operator[]를 사용하여 새 키-값 쌍 삽입:\n";
    print_key_value("new_key", u["new_key"]);
    std::cout << "\n`auto`를 사용하여 키-값 쌍 반복 및 출력;\n"
                 "new_key가 이제 맵의 키 중 하나입니다:\n";
    for (const auto& n : u)
        print_key_value(n.first, n.second);
}

가능한 출력:

Iterate and print key-value pairs of unordered_map, being
explicit with their types:
Key:[BLUE] Value:[#0000FF]
Key:[GREEN] Value:[#00FF00]
Key:[RED] Value:[#FF0000]
Iterate and print key-value pairs using C++17 structured binding:
Key:[BLUE] Value:[#0000FF]
Key:[GREEN] Value:[#00FF00]
Key:[RED] Value:[#FF0000]
Output values by key:
The HEX of color RED is:[#FF0000]
The HEX of color BLACK is:[#000000]
Use operator[] with non-existent key to insert a new key-value pair:
Key:[new_key] Value:[]
Iterate and print key-value pairs, using `auto`;
new_key is now one of the keys in the map:
Key:[new_key] Value:[]
Key:[WHITE] Value:[#FFFFFF]
Key:[BLACK] Value:[#000000]
Key:[BLUE] Value:[#0000FF]
Key:[GREEN] Value:[#00FF00]
Key:[RED] Value:[#FF0000]

결함 보고서

다음 동작 변경 결함 보고서들은 이전에 발표된 C++ 표준에 소급 적용되었습니다.

DR 적용 대상 게시된 동작 올바른 동작
LWG 2050 C++11 reference , const_reference , pointer
const_pointer 의 정의가 allocator_type 을 기반으로 함
value_type
std::allocator_traits 를 기반으로 함

참고 항목

키-값 쌍의 컬렉션, 키로 해싱됨
(클래스 템플릿)
키-값 쌍의 컬렉션, 키로 정렬됨, 키는 고유함
(클래스 템플릿)
(C++23)
두 개의 컨테이너를 적응시켜 고유 키로 정렬된 키-값 쌍의 컬렉션을 제공함
(클래스 템플릿)