이 글에서는 C++ STL에서 multimap::cbegin()과 multimap::cend() 함수의 동작 원리, 문법, 그리고 실제 사용 예제를 자세히 알아보겠습니다.
C++ STL에서 multimap이란?
multimap은 map 컨테이너와 유사한 연관 컨테이너(associative container)입니다. 키(key)와 매핑된 값(mapped value)의 조합으로 구성된 요소들을 특정 순서대로 저장할 수 있습니다. 일반적인 map과 달리, multimap에서는 동일한 키를 가진 여러 요소가 존재할 수 있다는 점이 가장 큰 차이점입니다. 또한 내부적으로 데이터는 항상 키를 기준으로 정렬된 상태로 유지됩니다.
multimap::cbegin()이란?
multimap::cbegin() 함수는 C++ STL에 내장된 함수로, <map> 헤더 파일에 정의되어 있습니다. cbegin()은 'constant begin'을 의미하며, multimap 컨테이너의 첫 번째 요소를 가리키는 상수 반복자(constant iterator)를 반환합니다. 반환된 반복자는 상수 반복자이므로 이를 사용해 컨테이너의 내용을 수정할 수 없습니다. 대신 반복자를 증가·감소시키면서 컨테이너의 요소들을 안전하게 순회할 수 있습니다.
문법
multi.cbegin();
매개변수
이 함수는 매개변수를 받지 않습니다.
반환값
해당 multimap 컨테이너의 첫 번째 요소를 가리키는 상수 반복자를 반환합니다.
입력 예시
multimap<char, int> newmap;
newmap.insert(make_pair('a', 1));
newmap.insert(make_pair('b', 2));
newmap.insert(make_pair('c', 3));
auto it = newmap.cbegin();
출력 결과 −
a = 1
예제 코드
#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.cbegin();
cout << "multimap의 첫 번째 요소: ";
cout << "{" << it->first << ", " << it->second << "}\n";
cout << "\nmultimap의 전체 요소 : \n";
cout << "키\t값\n";
for (auto i = mul.cbegin(); i != mul.cend(); i++){
cout << i->first << "\t" << i->second << endl;
}
return 0;
}
출력 결과
위 코드를 실행하면 다음과 같은 결과가 출력됩니다 −
multimap의 첫 번째 요소: {1, 50}
multimap의 전체 요소 :
키 값
1 50
1 40
1 10
2 30
2 20
5 60
multimap::cend()란?
multimap::cend() 함수 역시 C++ STL에 내장된 함수로, <map> 헤더 파일에 정의되어 있습니다. cend()는 'constant end'를 의미하며, 해당 multimap 컨테이너의 마지막 요소 바로 다음 위치(past-the-last element)를 가리키는 상수 반복자를 반환합니다.
반환되는 반복자는 상수 반복자이기 때문에 컨테이너의 내용을 수정하는 데 사용할 수 없으며, 오직 요소를 읽고 순회하는 용도로만 활용됩니다.
multimap::cbegin()과 multimap::cend()를 함께 사용하면 범위의 시작과 끝을 지정하여 컨테이너 전체를 손쉽게 순회할 수 있습니다.
문법
multi.cend();
매개변수
이 함수는 매개변수를 받지 않습니다.
반환값
해당 multimap 컨테이너의 마지막 요소 다음 위치를 가리키는 상수 반복자를 반환합니다.
입력 예시 −
multimap<char, int> newmap;
newmap.insert(make_pair('a', 1));
newmap.insert(make_pair('b', 2));
newmap.insert(make_pair('c', 3));
newmap.cend();
출력 결과 −
error
cend()가 가리키는 위치에는 실제 유효한 요소가 존재하지 않으므로, 이 반복자를 역참조하려 하면 오류가 발생합니다. 따라서 cend()는 반드시 순회의 종료 조건으로만 사용해야 합니다.
예제 코드
#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 << "\nmultimap의 전체 요소 : \n";
cout << "키\t값\n";
for (auto i = mul.cbegin(); i != mul.cend(); i++){
cout << i->first << "\t" << i->second << endl;
}
return 0;
}
출력 결과
위 코드를 실행하면 다음과 같은 결과가 출력됩니다 −
multimap의 전체 요소 : 키 값 1 50 1 40 1 10 2 30 2 20 5 60