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

C++ STL set 컨테이너의 cbegin()과 cend() 함수 완벽 정리

이 글에서는 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) 특성에 맞게 안전하게 컨테이너를 읽기 전용으로 탐색할 수 있게 해줍니다.