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

C++ STL에서 map(또는 unordered_map) 순회하기

이 글에서는 C++의 map 컨테이너와 그 사용법에 대해 자세히 알아보겠습니다.

map 컨테이너란?

map은 요소들을 해시 매핑 방식으로 저장하는 연관 컨테이너(associative container)입니다. 각 요소는 키(key)와 값(value)의 쌍으로 구성되며, 서로 다른 두 요소가 동일한 키를 가질 수 없습니다. 즉, 키는 항상 고유해야 하며 이를 통해 값에 빠르게 접근할 수 있습니다.

map의 주요 메서드

C++ map 컨테이너에서 제공하는 기본적인 메서드는 다음과 같습니다.

begin() — 맵의 첫 번째 요소를 가리키는 반복자(iterator)를 반환합니다.

end() — 맵의 마지막 요소 바로 다음 위치에 있는 이론적 요소를 가리키는 반복자를 반환합니다.

size() — 맵에 현재 저장된 요소의 개수를 반환합니다.

max_size() — 맵이 시스템 제약 조건에 따라 담을 수 있는 최대 요소 개수를 반환합니다.

empty() — 맵이 비어 있는지 여부를 불리언 값으로 반환합니다.

map 순회 예제

다음 예제는 배열에 담긴 값들의 빈도를 map을 이용해 계산하고, 범위 기반 for문으로 순회하며 출력합니다.

#include <bits/stdc++.h>
using namespace std;
int main() {
    int A[] = { 2, 2, 3, 2, 2, 4, 5, 4 };
    int num = sizeof(A) / sizeof(A[0]);
    map<int, int> my_map;
    for (int p = 0; p < num; p++)
        my_map[A[p]]++;
    cout << "Item Frequency" << endl;
    for (auto p : my_map)
        cout << p.first << " : " << p.second << endl;
}

실행 결과

Item Frequency
2 : 4
3 : 1
4 : 2
5 : 1

map은 내부적으로 키를 기준으로 정렬하여 저장하기 때문에, 출력 결과가 키 오름차순(2, 3, 4, 5)으로 나타나는 것을 확인할 수 있습니다.

unordered_map 순회

unordered_map은 C++ STL에 포함된 또 다른 종류의 map 컨테이너입니다. 역시 연관 컨테이너로서 키-값 쌍으로 구성된 요소들을 저장하며, 키는 해당 값을 고유하게 식별하는 역할을 합니다. 키와 값 모두 기본 타입(int, string 등)뿐 아니라 사용자 정의 타입도 사용할 수 있습니다.

map과의 가장 큰 차이점은 정렬 여부입니다. unordered_map은 이름 그대로 해시 기반으로 구현되어 있어 요소들이 특정 순서 없이 저장되며, 따라서 순회 시 출력 순서가 실행 환경마다 달라질 수 있습니다. 대신 평균적으로 더 빠른 조회 성능(O(1))을 제공합니다.

unordered_map 예제

다음은 위의 map 예제를 unordered_map으로 변경한 코드입니다.

#include <bits/stdc++.h>
using namespace std;
int main() {
    int A[] = { 2, 2, 3, 2, 2, 4, 5, 4 };
    int num = sizeof(A) / sizeof(A[0]);
    unordered_map<int, int> my_map;
    for (int p = 0; p < num; p++)
        my_map[A[p]]++;
    cout << "Item Frequency" << endl;
    for (auto p : my_map)
        cout << p.first << " : " << p.second << endl;
}

실행 결과

Item Frequency
5 : 1
4 : 2
2 : 4
3 : 1

출력 결과에서 볼 수 있듯이, unordered_map은 키 순서대로 정렬되지 않고 해시 함수에 의해 결정된 임의의 순서로 요소가 출력됩니다. 따라서 정렬된 결과가 필요하다면 map을, 조회 속도가 중요하다면 unordered_map을 선택하는 것이 좋습니다.