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

C++ STL list::rbegin()과 rend() 함수 완벽 가이드 – 역방향 반복자로 리스트 순회하기

이 글에서는 C++ STL에서 제공하는 list::rbegin()list::rend() 함수의 동작 원리, 문법, 그리고 실제 사용 예제를 자세히 살펴보겠습니다. 두 함수는 리스트를 뒤에서부터 앞으로 순회할 수 있게 해주는 역방향 반복자(reverse iterator)와 관련된 핵심 기능입니다.

STL에서 리스트(List)란 무엇인가?

리스트는 시퀀스 내 어느 위치에서든 상수 시간(O(1))에 삽입과 삭제를 수행할 수 있는 자료구조입니다. 리스트는 이중 연결 리스트(doubly linked list)로 구현되어 있어 비연속적인 메모리 할당을 허용합니다. 배열(array), 벡터(vector), 덱(deque)에 비해 컨테이너의 임의 위치에서 요소를 삽입, 추출, 이동하는 작업이 훨씬 효율적이라는 장점이 있습니다.

다만 리스트는 요소에 대한 직접 접근 속도가 느린 편이며, forward_list와 유사하지만 forward_list 객체는 단일 연결 리스트(singly linked list)이므로 앞쪽(forward) 방향으로만 순회할 수 있다는 차이가 있습니다.

list::rbegin()이란?

list::rbegin()은 C++ STL의 <list> 헤더 파일에 선언된 내장 함수입니다. rbegin()은 'reverse begin'의 약자로, 리스트의 마지막 요소를 가리키는 역방향 반복자를 반환합니다. 역방향 반복자는 컨테이너의 끝에서 시작하여 시작 지점을 향해 거꾸로 이동하는 반복자를 의미합니다.

back() 함수 역시 마지막 요소를 반환하지만, rbegin()이 반환하는 것은 뒤쪽으로 이동 가능한 양방향(bidirectional) 반복자라는 점에서 차이가 있습니다.

문법

list_container1.rbegin();

매개변수

이 함수는 어떠한 매개변수도 받지 않습니다.

예제

입력: list<int> List_container = {10, 11, 13, 15};
      List_container.rbegin();
출력:
      List = 15

반환 값

이 함수는 리스트의 마지막 요소를 가리키는 역방향 반복자를 반환합니다. 역방향 반복자란 끝에서 시작 지점 방향, 즉 뒤쪽으로 이동하는 반복자를 의미합니다.

rbegin() 활용 예제

#include <bits/stdc++.h>
using namespace std;
int main(){
    list<int> myList = { 10, 20, 30, 40 };
    cout<<"List is: ";
    for (auto i = myList.rbegin(); i != myList.rend(); ++i)
        cout << *i << " ";
    return 0;
}

출력 결과

위 코드를 실행하면 다음과 같은 결과가 출력됩니다 −

List is: 40 30 20 10

리스트에 저장된 요소들이 역순(40, 30, 20, 10)으로 출력되는 것을 확인할 수 있습니다.

list::rend()란?

list::rend() 역시 C++ STL의 <list> 헤더 파일에 선언된 내장 함수입니다. rend()는 'reverse end'의 약자로, 연관된 리스트 컨테이너의 첫 번째 요소 바로 앞 위치를 가리키는 역방향 반복자를 반환합니다. 역방향 반복자는 끝에서 시작하여 시작 지점을 향해 거꾸로 이동하며, rend()가 반환하는 반복자는 역방향 순회의 종료 조건(end) 역할을 합니다.

문법

list_container1.rend();

매개변수

이 함수는 어떠한 매개변수도 받지 않습니다.

예제

입력: list<int> List_container = { 10, 11, 13, 15};
      List_container.rend();
출력:
      List = 5 // 리스트 시작 위치 이전의 임의 값을 나타냄

반환 값

이 함수는 리스트의 첫 번째 요소 바로 앞을 가리키는 역방향 반복자를 반환합니다. 이 위치는 역방향 순회가 끝나는 지점을 표시하며, 일반적으로 역참조(dereference)하여 사용하지 않습니다.

rend() 활용 예제

#include <bits/stdc++.h>
using namespace std;
int main(){
    list<int> myList = { 10, 20, 30, 40 };
    cout<<"List is : ";
    for (auto i = myList.rbegin(); i != myList.rend(); ++i)
        cout << *i << " ";
    return 0;
}

출력 결과

위 코드를 실행하면 다음과 같은 결과가 출력됩니다 −

List is: 40 30 20 10

정리

rbegin()과 rend()는 각각 정방향 반복자의 begin()과 end()에 대응하는 역방향 버전입니다. 두 함수를 함께 사용하면 리스트를 마지막 요소부터 첫 번째 요소까지 거꾸로 순회할 수 있습니다. 특히 최근 삽입된 데이터부터 처리해야 하거나, 역순 출력이 필요한 경우에 매우 유용하게 활용할 수 있습니다.