이 글에서는 C++ STL의 map::cbegin()과 map::cend() 함수의 동작 방식, 문법, 그리고 실제 사용 예제를 자세히 살펴보겠습니다.
C++ STL에서 맵(Map)이란?
맵(map)은 연관 컨테이너(associative container)로, 키(key)와 매핑된 값(mapped value)의 조합으로 이루어진 요소들을 특정 순서에 따라 저장합니다. 맵 컨테이너 내부의 데이터는 항상 연관된 키를 기준으로 자동 정렬되며, 저장된 값들은 고유한 키를 통해 접근할 수 있습니다.
map::cbegin()이란?
map::cbegin()은 C++ STL의 내장 함수로, <map> 헤더 파일에 정의되어 있습니다. cbegin()은 'constant begin'의 줄임말로, 상수 반복자를 반환하는 함수입니다.
이 함수는 맵 컨테이너의 첫 번째 요소를 가리키는 상수 반복자(const_iterator)를 반환합니다. 반환된 반복자는 상수 반복자이므로 이를 통해 컨테이너의 내용을 수정할 수 없습니다. 대신 반복자를 증가 또는 감소시켜 맵 컨테이너의 요소들을 순회(traverse)하는 데 활용할 수 있습니다.
문법
newmap.cbegin();
매개변수
이 함수는 어떤 매개변수도 받지 않습니다.
반환 값
연관된 맵 컨테이너의 첫 번째 요소를 가리키는 상수 반복자를 반환합니다.
예제
입력
map<char, int> newmap; newmap['a'] = 1; newmap['b'] = 2; newmap['c'] = 3; newmap.cbegin();
출력
a = 1
실전 코드 예제
#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::cbegin을 사용하여 첫 번째 요소 가져오기
auto temp = TP_Map.cbegin();
cout << "First element is: " << temp->first << " -> " << temp->second;
cout << "\nTP Map is : \n";
cout << "MAP_KEY\tMAP_ELEMENT\n";
for (auto i = TP_Map.cbegin(); i != TP_Map.cend(); i++) {
cout << i->first << "\t" << i->second << endl;
}
return 0;
}
출력
First element is: 1 -> 10 TP Map is: MAP_KEY MAP_ELEMENT 1 10 2 30 3 50 4 70
위 예제에서 볼 수 있듯이, 요소가 삽입된 순서와 무관하게 맵은 항상 키를 기준으로 오름차순 정렬되어 있으므로 cbegin()이 반환하는 첫 번째 요소는 키가 가장 작은 {1, 10}입니다.
map::cend()란?
map::cend() 역시 C++ STL의 내장 함수로, <map> 헤더 파일에 정의되어 있습니다. cend()는 'constant end'의 줄임말로, 맵 컨테이너의 마지막 요소 다음(past-the-last element) 위치를 가리키는 상수 반복자를 반환합니다.
반환된 반복자는 상수 반복자이므로 컨테이너의 내용을 수정할 수 없으며, 반복자를 증가 또는 감소시켜 맵 컨테이너의 요소들을 순회하는 데 사용할 수 있습니다.
map::cbegin()과 map::cend()는 각각 탐색 범위의 시작과 끝을 제공하므로, 두 함수를 함께 사용하면 컨테이너 전체를 안전하게 순회할 수 있습니다.
문법
newmap.cend();
매개변수
이 함수는 어떤 매개변수도 받지 않습니다.
반환 값
연관된 맵 컨테이너의 마지막 요소 다음 위치를 가리키는 상수 반복자를 반환합니다.
예제
입력
map<char, int> newmap; newmap['a'] = 1; newmap['b'] = 2; newmap['c'] = 3; newmap.cend();
출력
error
cend()는 마지막 요소 '다음'의 가상 위치를 가리키므로, 해당 반복자를 역참조(dereference)하여 값을 읽으려 하면 오류가 발생합니다. 따라서 cend()는 주로 순회 종료 조건으로만 사용해야 합니다.
실전 코드 예제
#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.cbegin(); i != TP_Map.cend(); i++) {
cout << i->first << "\t" << i->second << endl;
}
return 0;
}
출력
TP Map is: MAP_KEY MAP_ELEMENT 1 10 2 30 3 50 4 70
정리
cbegin()과 cend()는 일반적인 begin(), end()와 달리 상수 반복자를 반환한다는 점이 핵심 차이입니다. 컨테이너를 단순히 읽기만 하는 경우에는 상수 반복자를 사용하는 것이 의도치 않은 데이터 변경을 방지하고 코드의 안정성을 높이는 좋은 습관입니다.