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

C++ STL multimap::crbegin()과 multimap::crend() 완벽 가이드

이 글에서는 C++ STL에서 multimap::crbegin()multimap::crend() 함수의 동작 방식, 문법, 그리고 실제 예제를 통해 역방향 상수 반복자의 사용법을 자세히 살펴보겠습니다.

C++ STL에서 Multimap이란?

Multimap은 map 컨테이너와 유사한 연관 컨테이너(associative container)입니다. 키(key)와 매핑된 값(mapped value)의 조합으로 이루어진 요소들을 특정 순서에 따라 저장할 수 있다는 점이 특징입니다. 일반 map과 달리 multimap에서는 동일한 키에 여러 개의 요소를 연결할 수 있으며, 데이터는 내부적으로 항상 키를 기준으로 자동 정렬됩니다.

multimap::crbegin()이란?

multimap::crbegin() 함수는 C++ STL의 내장 함수로, <map> 헤더 파일에 정의되어 있습니다. crbegin()은 'constant reverse begin'을 의미하며, 상수 시작 반복자인 cbegin()의 역방향 버전이라고 이해하면 됩니다. 즉, 이 함수는 해당 multimap 컨테이너의 마지막 요소를 가리키는 반복자를 반환합니다.

중요한 점은 이 반복자가 const 성격을 가진다는 것입니다. 따라서 multimap의 요소를 수정하는 데는 사용할 수 없고, 오직 컨테이너를 읽기 전용으로 순회(traverse)하는 용도로만 활용됩니다.

문법

multimap_name.crbegin();

매개변수

이 함수는 어떤 매개변수도 받지 않습니다.

반환 값

컨테이너의 마지막 요소를 가리키는 상수 역방향 반복자(const_reverse_iterator)를 반환합니다.

입력 예시

multimap<char, int> newmap;
newmap.insert(make_pair('a', 1));
newmap.insert(make_pair('b', 2));
newmap.insert(make_pair('c', 3));
newmap.crbegin();

출력

c:3

실전 예제

#include <bits/stdc++.h>
using namespace std;

int main(){
    // 컨테이너 생성
    multimap<int, int> mul;
    
    // emplace_hint를 이용한 삽입
    mul.emplace_hint(mul.begin(), 1, 10);
    mul.emplace_hint(mul.begin(), 2, 20);
    mul.emplace_hint(mul.begin(), 2, 30);
    mul.emplace_hint(mul.begin(), 1, 40);
    mul.emplace_hint(mul.begin(), 1, 50);
    mul.emplace_hint(mul.begin(), 5, 60);
    
    auto it = mul.crbegin();
    cout << "Last element using crbegin() is: {" << it->first 
         << ", " << it->second << "}\n";
    
    cout << "\nElements in multimap is : \n";
    cout << "KEY\tELEMENT\n";
    
    for (auto i = mul.crbegin(); i != mul.crend(); i++){
        cout << i->first << "\t" << i->second << endl;
    }
    return 0;
}

실행 결과

위 코드를 실행하면 다음과 같은 출력 결과를 얻을 수 있습니다.

Last element using crbegin() is: {5, 60}
Elements in multimap is :
KEY ELEMENT
5 60
2 20
2 30
1 10
1 40
1 50

실행 결과에서 확인할 수 있듯이, crbegin()은 컨테이너의 마지막(즉, 키 기준으로 가장 큰) 요소 {5, 60}부터 시작하여 역순으로 요소들을 순회합니다.

multimap::crend()란?

multimap::crend() 함수 역시 C++ STL의 내장 함수로, <map> 헤더 파일에 정의되어 있습니다. crend()는 'constant reverse end'를 의미하며, 상수 끝 반복자인 cend()의 역방향 버전입니다. 즉, 이 함수는 컨테이너의 첫 번째 요소 바로 앞 위치를 가리키는 반복자를 반환합니다.

crbegin()과 마찬가지로 이 반복자는 const 속성을 지니므로 multimap의 요소를 수정할 수 없으며, 역방향 순회 시 종료 조건으로 사용됩니다.

문법

newmultimap.crend();

매개변수

이 함수는 매개변수를 받지 않습니다.

반환 값

컨테이너의 첫 번째 요소 바로 앞 위치를 가리키는 상수 역방향 반복자를 반환합니다.

실전 예제

#include <bits/stdc++.h>
using namespace std;

int main(){
    // 컨테이너 생성
    multimap<int, int> mul;
    
    // emplace_hint를 이용한 삽입
    mul.emplace_hint(mul.begin(), 1, 10);
    mul.emplace_hint(mul.begin(), 2, 20);
    mul.emplace_hint(mul.begin(), 2, 30);
    mul.emplace_hint(mul.begin(), 1, 40);
    mul.emplace_hint(mul.begin(), 1, 50);
    mul.emplace_hint(mul.begin(), 5, 60);
    
    cout << "\nElements in multimap is : \n";
    cout << "KEY\tELEMENT\n";
    
    // crbegin()부터 crend()까지 역방향 순회
    for (auto i = mul.crbegin(); i != mul.crend(); i++){
        cout << i->first << "\t" << i->second << endl;
    }
    return 0;
}

실행 결과

위 코드를 실행하면 다음과 같은 출력 결과를 얻을 수 있습니다.

Elements in multimap is :
KEY ELEMENT
5 60
2 20
2 30
1 10
1 40
1 50

정리

multimap::crbegin()은 역방향 순회의 시작점(마지막 요소)을, multimap::crend()는 역방향 순회의 끝점(첫 번째 요소 앞)을 나타냅니다. 두 함수는 모두 읽기 전용 반복자를 반환하기 때문에 컨테이너의 데이터를 안전하게 조회만 할 수 있으며, 범위 기반 역방향 탐색 시 서로 짝을 이루어 사용하는 것이 일반적인 패턴입니다.