이 글에서는 C++ STL에서 multiset::crbegin()과 multiset::crend() 함수의 동작 방식, 문법, 그리고 실제 사용 예제를 자세히 알아보겠습니다.
C++ STL에서 multiset(다중 집합)이란?
multiset은 set 컨테이너와 매우 유사한 컨테이너입니다. set처럼 값을 키(key) 형태로 저장하며, 항상 특정한 정렬 순서를 유지합니다.
multiset에서도 값은 set과 동일하게 키로 식별됩니다. 두 컨테이너의 가장 큰 차이점은 set에는 고유한(distinct) 키만 저장되어 어떤 두 키도 같을 수 없는 반면, multiset은 동일한 키 값이 여러 개 존재할 수 있다는 점입니다.
multiset의 키는 내부적으로 이진 탐색 트리(binary search tree) 구현에 활용됩니다.
multiset::crbegin()이란?
multiset::crbegin()은 C++ STL에 내장된 함수로, <set> 헤더 파일에 정의되어 있습니다. crbegin()은 'constant reverse begin'의 약자로, multiset 컨테이너의 마지막 요소를 가리키는 상수 역방향 반복자(constant reverse iterator)를 반환합니다. 즉, 이 함수는 multiset::cbegin()의 역방향 버전이라고 할 수 있습니다.
상수 반복자는 컨테이너를 읽으며 순회(iterate)하는 용도로만 사용할 수 있으며, 컨테이너의 요소를 변경할 수 없습니다.
문법
ms_name.crbegin();
매개변수
이 함수는 어떠한 매개변수도 받지 않습니다.
반환 값
컨테이너의 마지막 요소를 가리키는 상수 반복자를 반환합니다.
예제 입력
std::multiset<int> mymultiset = {1, 2, 2, 3, 4};
mymultiset.crbegin();예제 출력
4
실전 예제
#include <bits/stdc++.h>
using namespace std;
int main(){
int arr[] = {10, 20, 30, 40, 50, 60};
multiset<int> check(arr, arr + 6);
cout<<"First element fetched using crbegin() function: "<<*(check.crbegin()) << endl;
for(auto i = check.crbegin(); i!= check.crend(); i++)
cout << *i << " ";
return 0;
}
출력 결과
First element fetched using crbegin() function: 60
60 50 40 30 20 10
multiset::crend()란?
multiset::crend() 역시 C++ STL에 내장된 함수로, <set> 헤더 파일에 정의되어 있습니다. crend()는 'constant reverse end'의 약자로, multiset 컨테이너의 첫 번째 요소 바로 앞 위치를 가리키는 상수 역방향 반복자를 반환합니다. 이 함수는 cend()의 역방향 버전입니다.
상수 반복자는 컨테이너를 순회하는 용도로만 사용할 수 있으며, 컨테이너의 요소를 수정할 수 없습니다.
문법
ms_name.crend();
매개변수
이 함수는 어떠한 매개변수도 받지 않습니다.
반환 값
컨테이너의 첫 번째 요소 이전 위치를 가리키는 상수 반복자를 반환합니다. 따라서 이 위치를 직접 역참조(dereference)하려고 하면 오류가 발생합니다.
예제 입력
std::multiset<int> mymultiset = {1, 2, 2, 3, 4};
mymultiset.crend();예제 출력
error
실전 예제
#include <bits/stdc++.h>
using namespace std;
int main(){
int arr[] = {10, 20, 30, 40, 50, 60};
multiset<int> check(arr, arr + 6);
cout<<"Elements in the list are: ";
for(auto i = check.crbegin(); i!= check.crend(); i++)
cout << *i << " ";
return 0;
}
출력 결과
Elements in the list are: 60 50 40 30 20 10
정리
crbegin()과 crend()는 각각 역방향 순회의 시작과 끝을 나타내며, 두 반복자를 함께 사용하면 multiset의 요소를 큰 값부터 작은 값 순으로 안전하게 읽어올 수 있습니다. 단, 상수 반복자이므로 순회 중 요소 값을 변경할 수 없다는 점을 기억해야 합니다.