이 글에서는 C++ STL의 set::cbegin()과 set::cend() 함수에 대해 자세히 알아보겠습니다. 두 함수의 문법, 동작 방식, 반환값까지 예제 코드와 함께 살펴봅니다.
C++ STL에서 set란 무엇인가?
C++ STL의 set(집합)은 고유한(unique) 요소들만을 정렬된 순서로 저장하는 연관 컨테이너입니다. set에 저장되는 값 자체가 곧 해당 요소를 식별하는 기준이 되기 때문에 중복된 값을 가질 수 없습니다.
한 번 set에 추가된 요소의 값은 수정할 수 없지만, 요소를 새로 삽입하거나 삭제하는 것은 언제든 가능합니다. 내부적으로 set는 이진 탐색 트리(binary search tree)로 구현되어 있어 검색, 삽입, 삭제 작업이 효율적으로 이루어집니다.
set::cbegin() 함수란?
cbegin()은 C++ STL에 내장된 함수로, 헤더 파일에 정의되어 있습니다. 이 함수는 set 컨테이너의 첫 번째 요소를 가리키는 상수 반복자(constant iterator)를 반환합니다.
set 컨테이너의 모든 반복자는 상수 반복자이기 때문에 이를 통해 컨테이너의 내용을 수정할 수 없습니다. 다만 반복자를 증가하거나 감소시켜 set의 요소들을 순회(traverse)하는 용도로 사용할 수 있습니다.
문법
constant_iterator name_of_set.cbegin();
매개변수
이 함수는 어떠한 매개변수도 받지 않습니다.
반환값
set 컨테이너의 첫 번째 요소를 가리키는 상수 반복자(constant_iterator)를 반환합니다.
예제 1: cbegin()으로 첫 번째 요소 확인하기
#include <iostream>
#include <set>
using namespace std;
int main() {
set<int> set_a = {18, 34, 12, 10, 44};
cout << "set 컨테이너의 첫 번째 요소: ";
cout << *(set_a.cbegin());
return 0;
}출력 결과
set 컨테이너의 첫 번째 요소: 10
set은 항상 오름차순으로 정렬되기 때문에 {18, 34, 12, 10, 44}를 저장하면 내부적으로 {10, 12, 18, 34, 44} 순서로 정렬됩니다. 따라서 cbegin()이 가리키는 첫 번째 요소는 10입니다.
예제 2: cbegin()으로 전체 순회하기
#include <iostream>
#include <set>
using namespace std;
int main() {
set<int> set_a = {18, 34, 12, 10, 44};
cout << "set_a의 요소:";
for (auto it = set_a.cbegin(); it != set_a.cend(); ++it)
cout << ' ' << *it;
cout << '\n';
return 0;
}출력 결과
set_a의 요소: 10 12 18 34 44
set::cend() 함수란?
cend() 역시 C++ STL에 내장된 함수로, 헤더 파일에 정의되어 있습니다. 이 함수는 set 컨테이너의 마지막 요소 바로 다음 위치를 가리키는 상수 반복자를 반환합니다.
cbegin()과 마찬가지로 set의 반복자는 모두 상수 반복자이므로 컨테이너의 내용을 수정할 수 없으며, 요소 순회 목적으로만 사용됩니다.
문법
constant_iterator name_of_set.cend();
매개변수
이 함수는 어떠한 매개변수도 받지 않습니다.
반환값
시퀀스의 끝(past-the-end)을 가리키는 상수 반복자(constant_iterator)를 반환합니다.
cend()는 마지막 요소의 다음 위치를 가리키기 때문에, 일반적으로 cbegin() 또는 begin()과 함께 사용하여 set 전체를 순회하는 데 활용됩니다.
예제 1: cend()가 가리키는 값 확인하기
#include <iostream>
#include <set>
using namespace std;
int main() {
set<int> set_a = {18, 34, 11, 10, 44};
cout << "끝 다음 위치의 값: ";
cout << *(set_a.cend());
return 0;
}출력 결과
끝 다음 위치의 값: (임의의 쓰레기 값)
주의: cend()는 실제 유효한 요소가 아닌 끝 다음(past-the-end) 위치를 가리키므로, 이를 역참조하면 정의되지 않은 동작(undefined behavior)이 발생하며 임의의 값이 출력될 수 있습니다. cend()는 반드시 순회 종료 조건으로만 사용해야 합니다.
예제 2: cbegin()과 cend()로 전체 순회하기
#include <iostream>
#include <set>
using namespace std;
int main() {
set<int> set_a = {18, 34, 12, 10, 44};
cout << "set_a의 요소:";
for (auto it = set_a.cbegin(); it != set_a.cend(); ++it)
cout << ' ' << *it;
cout << '\n';
return 0;
}출력 결과
set_a의 요소: 10 12 18 34 44
정리
cbegin()은 set의 첫 번째 요소를, cend()는 마지막 요소의 다음 위치를 가리키는 상수 반복자를 반환합니다. 두 함수는 주로 범위 기반 순회의 시작점과 끝점으로 함께 사용되며, set의 불변성(immutability) 특성에 맞게 안전하게 컨테이너를 읽기 전용으로 탐색할 수 있게 해줍니다.