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

C++ STL map 컨테이너의 crbegin() 및 crend() 함수 완벽 가이드

이 글에서는 C++ STL에서 map::crbegin()과 map::crend() 함수의 동작 방식, 문법, 그리고 실제 예제를 자세히 살펴보겠습니다.

C++ STL에서 Map이란?

Map은 연관 컨테이너(associative container)로, 키(key)와 매핑된 값(mapped value)의 조합으로 이루어진 요소들을 특정 순서에 따라 저장할 수 있게 해줍니다. map 컨테이너 내부에서 데이터는 항상 연관된 키를 기준으로 자동 정렬되어 유지되며, 저장된 값은 각각의 고유한 키를 통해 접근할 수 있습니다.

map::crbegin()이란?

map::crbegin() 함수는 C++ STL의 내장 함수로, <map> 헤더 파일에 정의되어 있습니다. crbegin()은 'constant reverse begin'을 의미하며, 상수 begin 반복자인 cbegin의 역방향 버전이라고 생각하면 됩니다. 즉, crbegin()은 해당 map 컨테이너의 마지막 요소를 가리키는 역방향 상수 반복자(const reverse iterator)를 반환합니다. 이 반복자는 map을 수정하는 데 사용할 수 없으며, 단순히 컨테이너를 읽기 전용으로 순회하는 용도로만 활용됩니다.

문법(Syntax)

Map_name.crbegin();

매개변수(Parameter)

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

반환값(Return Value)

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

예제

입력

map<char, int> newmap;
newmap['a'] = 1;
newmap['b'] = 2;
newmap['c'] = 3;
newmap.crbegin();

출력

c:3

map::crbegin 실전 예제 코드

#include <bits/stdc++.h>
using namespace std;
int main() {
    map<int, int> TP_Map;
    TP_Map.insert({3, 50});
    TP_Map.insert({2, 30});
    TP_Map.insert({1, 10});
    TP_Map.insert({4, 70});
    // map::crbegin으로 마지막 요소 가져오기
    auto temp = TP_Map.crbegin();
    cout<<"First element is: "<<temp->first << " -> " << temp->second;
    cout<<"\nTP Map is : \n";
    cout << "MAP_KEY\tMAP_ELEMENT\n";
    for (auto i = TP_Map.crbegin(); i!= TP_Map.crend(); i++) {
        cout << i->first << "\t" << i->second << endl;
    }
    return 0;
}

출력

First element is: 4 -> 70
TP Map is:
MAP_KEY    MAP_ELEMENT
4           70
3           50
2           30
1           10

map::crend()란?

map::crend() 함수 역시 C++ STL의 내장 함수로, <map> 헤더 파일에 정의되어 있습니다. crend()는 'constant reverse end'를 의미하며, 상수 end 반복자인 cend의 역방향 버전입니다. 즉, crend()는 해당 map 컨테이너의 첫 번째 위치 바로 앞을 가리키는 역방향 상수 반복자를 반환합니다. 이 반복자 또한 map을 수정하는 데 사용할 수 없고, 컨테이너를 읽기 전용으로 순회하는 용도로만 사용해야 합니다.

문법(Syntax)

newmap.crend();

매개변수(Parameter)

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

반환값(Return Value)

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

예제

입력

map<char, int> newmap;
newmap['a'] = 1;
newmap['b'] = 2;
newmap['c'] = 3;
newmap.crend();

출력

error

위 예시처럼 crend()가 반환하는 반복자는 유효한 요소를 가리키지 않으므로, 이를 직접 역참조(dereference)하면 오류가 발생합니다. crend()는 주로 역방향 순회의 종료 조건으로 사용됩니다.

map::crend 실전 예제 코드

#include <bits/stdc++.h>
using namespace std;
int main() {
    map<int, int> TP_Map;
    TP_Map.insert({3, 50});
    TP_Map.insert({2, 30});
    TP_Map.insert({1, 10});
    TP_Map.insert({4, 70});
    cout<<"\nTP Map is : \n";
    cout << "MAP_KEY\tMAP_ELEMENT\n";
    for (auto i = TP_Map.crbegin(); i!= TP_Map.crend(); i++) {
        cout << i->first << "\t" << i->second << endl;
    }
    return 0;
}

출력

TP Map is:
MAP_KEY    MAP_ELEMENT
4           70
3           50
2           30
1           10

정리

crbegin()은 map의 마지막 요소(역방향 순회의 시작점)를 가리키고, crend()는 역방향 순회의 끝, 즉 첫 번째 요소 앞의 위치를 가리킵니다. 두 함수 모두 const_reverse_iterator를 반환하기 때문에 컨테이너를 수정할 수 없으며, 읽기 전용 역방향 순회에 적합합니다. map은 키를 기준으로 오름차순 정렬되어 있으므로, crbegin()부터 crend()까지 순회하면 요소를 내림차순으로 탐색할 수 있다는 점이 큰 장점입니다.