이 글에서는 C++ STL에서 multiset::cbegin()과 multiset::cend() 함수의 동작 방식, 문법, 그리고 실제 사용 예제를 자세히 살펴보겠습니다.
C++ STL에서 멀티셋(multiset)이란?
멀티셋은 셋(set) 컨테이너와 유사한 컨테이너입니다. 셋처럼 값을 키(key) 형태로 저장하며, 항상 특정한 정렬 순서를 유지합니다.
멀티셋에서도 값은 셋과 마찬가지로 키로 식별됩니다. 두 컨테이너의 핵심적인 차이점은 다음과 같습니다. 셋은 중복을 허용하지 않아 모든 키가 고유해야 하지만, 멀티셋은 동일한 키 값을 여러 개 저장할 수 있습니다.
멀티셋의 키는 내부적으로 이진 탐색 트리(binary search tree)를 구현하는 데 활용됩니다.
multiset::cbegin()이란?
multiset::cbegin()은 C++ STL에 내장된 함수로, <set> 헤더 파일에 정의되어 있습니다. 이름에서 알 수 있듯이 cbegin()은 'constant begin(상수 시작)'을 의미하며, 멀티셋 컨테이너의 첫 번째 요소를 가리키는 상수 반복자(const iterator)를 반환합니다.
상수 반복자는 멀티셋 컨테이너를 순회(iteration)하는 용도로만 사용할 수 있으며, 이를 통해 컨테이너의 내용을 변경하는 것은 불가능합니다.
문법
ms_name.cbegin();
매개변수
이 함수는 어떠한 매개변수도 받지 않습니다.
반환값
컨테이너의 첫 번째 요소를 가리키는 상수 반복자를 반환합니다.
예제
입력
std::multiset<int> mymultiset = {1, 2, 2, 3, 4};
mymultiset.cbegin();출력
1
실전 예제 코드
#include <bits/stdc++.h>
using namespace std;
int main() {
int arr[] = {10, 20, 30, 40, 50, 60};
multiset<int> check(arr, arr + 6);
cout<<"cbegin() 함수로 가져온 첫 번째 요소: "<<*(check.cbegin()) << endl;
for(auto i = check.cbegin(); i!= check.cend(); i++)
cout << *i << " ";
return 0;
}출력
cbegin() 함수로 가져온 첫 번째 요소: 10 10 20 30 40 50 60
multiset::cend()란?
multiset::cend() 역시 C++ STL에 내장된 함수로, <set> 헤더 파일에 정의되어 있습니다. cend()는 'constant end(상수 끝)'를 의미하며, 멀티셋 컨테이너의 마지막 요소 바로 다음 위치(past-the-end)를 가리키는 상수 반복자를 반환합니다.
마찬가지로 이 상수 반복자는 컨테이너를 순회하는 용도로만 사용할 수 있고, 요소 값을 수정할 수 없습니다.
문법
ms_name.cend();
매개변수
이 함수는 어떠한 매개변수도 받지 않습니다.
반환값
컨테이너의 마지막 요소 다음 위치를 가리키는 상수 반복자를 반환합니다.
예제
cend()가 반환하는 반복자는 마지막 요소의 다음 위치를 가리키므로, 이를 역참조(dereference)하여 출력하려고 하면 오류가 발생합니다.
입력
std::multiset<int> mymultiset = {1, 2, 2, 3, 4};
mymultiset.cend();출력
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<<"리스트의 요소들: ";
for(auto i = check.cbegin(); i!= check.cend(); i++)
cout << *i << " ";
return 0;
}출력
리스트의 요소들: 10 20 30 40 50 60
정리
cbegin()과 cend()는 각각 컨테이너의 시작과 끝(마지막 요소 다음)을 가리키는 상수 반복자를 반환하며, 주로 범위 기반 순회에 함께 사용됩니다. 일반 begin()/end()와 달리 컨테이너를 수정하지 않는 읽기 전용 순회가 필요할 때 유용하게 활용할 수 있습니다.