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

C++ STL 다중 집합(multiset)의 crbegin() 및 crend() 함수 완벽 정리

이 글에서는 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의 요소를 큰 값부터 작은 값 순으로 안전하게 읽어올 수 있습니다. 단, 상수 반복자이므로 순회 중 요소 값을 변경할 수 없다는 점을 기억해야 합니다.