Modern C++
에서std::unordered_map
은 키-값 쌍을 저장하는 해시 기반의 연관 컨테이너로, 빠른 검색과 삽입, 삭제가 필요한 경우 유용하게 사용됩니다.- 이 글에서는
unordered_map
을 순회하는 두 가지 방법과 함께,C++17
에서 도입된 구조 분해(Structured Bindings
) 의 개념도 함께 설명드립니다.
std::unordered_map
은C++11
에서 처음 표준에 도입 된 컨테이너(Container
) 입니다.- 내부적으로 해시 테이블 을 사용하여 평균적으로
O(1)
에 가까운 성능으로 데이터를 검색하거나 삽입할 수 있습니다. - 정렬된 순서가 보장되지 않으며, 키의 순서에 의존하지 않는 경우에 적합합니다.
C++11
이전에는 표준이 아니었던hash_map
(예:<ext/hash_map>
) 등을 사용하는 대체 방안이 있습니다.
-
cpp
for (const auto& kv : my_map) { std::cout << "key=" << kv.first << " value=" << kv.second << "\n"; }
kv
는std::pair<const Key, Value>
의const
참조입니다..first
로 키,.second
로 값을 참조합니다.
-
cpp
for (const auto& [key, value] : my_map) { std::cout << "key=" << key << " value=" << value << "\n"; }
C++17
에서 도입된 구조 분해 문법 을 활용한 방법입니다.- 코드가 더 간결하고 가독성이 뛰어납니다.
std::pair
의 멤버를[key, value]
형식으로 직접 변수에 바인딩할 수 있습니다.
- 구조 분해 (
Structured Bindings
) 는C++17
에서 새롭게 추가된 기능으로, 복합 자료형의 내부 값을 분해하여 별도 변수로 바인딩 할 수 있게 해줍니다.
-
cpp
std::pair<std::string, int> p{"apple", 3}; // 구조 분해 방식 auto [key, value] = p;
key
는"apple"
,value
는3
을 가집니다.std::tuple
, 구조체, 배열 등에도 사용할 수 있습니다.
-
순회 방식 문법 예시 C++
버전가독성 특이사항 전통적인 방식 kv.first
,kv.second
C++11
+보통 모든 C++11
코드에서 사용 가능구조 분해 방식 [key, value]
C++17
+좋음 더 간결하고 직관적임 -
순회 시에는
C++11
스타일(.first
,.second
)과C++17
스타일(구조 분해) 모두 가능하므로, 자신의 프로젝트 환경에 맞는 문법을 선택 하여 사용하면 됩니다. -
C++17
이상을 사용 중이라면 구조 분해를 적극 활용하는 것이 코드 가독성 측면에서 큰 도움이 됩니다.