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