개발자공부일기

C++ auto, rbegin, rend - STL 반복자를 더 쉽게 이해하는 방법 본문

Language/C++

C++ auto, rbegin, rend - STL 반복자를 더 쉽게 이해하는 방법

JavaCPP 2025. 8. 15. 09:00

auto란 무엇인가?

auto는 C++11부터 도입된 타입 추론 키워드입니다. 즉, 변수 선언 시 개발자가 자료형을 직접 쓰지 않아도 컴파일러가 자동으로 판단하여 변수 타입을 정해줍니다.

예전에는 반복자를 다음과 같이 선언해야 했습니다.

std::vector<int>::iterator it = vec.begin();

하지만 auto를 사용하면 아래처럼 훨씬 간단하게 쓸 수 있습니다.

auto it = vec.begin();

auto의 주요 특징

  • 복잡한 타입도 자동 처리: 반복자, 람다, map, pair 등에서 유용
  • 코드 가독성 향상: 자료형 생략으로 깔끔한 코드 작성 가능
  • 유지보수에 유리: 자료형이 바뀌어도 변수 선언을 바꿀 필요가 없음

rbegin()과 rend()란 무엇인가?

STL 컨테이너에서는 일반적으로 begin()과 end()를 이용하여 앞에서부터 순차적으로 데이터를 순회합니다. 그러나 rbegin()과 rend()는 뒤에서부터 거꾸로 순회할 수 있게 해주는 기능입니다.

rbegin()과 rend() 설명

  • rbegin()은 마지막 요소를 가리키는 역방향 반복자를 반환합니다.
  • rend()는 처음 요소보다 앞에 있는 위치를 가리키는 반복자를 반환합니다.

즉, rbegin()에서 시작해서 rend() 전까지 순회하면 컨테이너를 역순으로 순회할 수 있습니다.


rbegin()과 rend() 예제

벡터를 역순으로 출력하는 예제

#include <iostream>
#include <vector>

int main() {
    std::vector<int> numbers = {10, 20, 30, 40, 50};

    for (auto it = numbers.rbegin(); it != numbers.rend(); ++it) {
        std::cout << *it << " ";
    }

    return 0;
}

출력 결과

50 40 30 20 10

이처럼 rbegin()과 rend()를 사용하면 벡터의 마지막 요소부터 첫 번째 요소까지 거꾸로 접근할 수 있습니다.


begin()과 end()와의 사용 차이점

 

구분  설명
begin() 첫 번째 요소를 가리키는 반복자
end() 마지막 요소 다음 위치를 가리키는 반복자
rbegin() 마지막 요소를 가리키는 역방향 반복자
rend() 첫 번째 요소 이전 위치를 가리키는 역방향 반복자

비교 예제

#include <iostream>
#include <vector>

int main() {
    std::vector<int> data = {1, 2, 3, 4, 5};

    std::cout << "정방향 출력: ";
    for (auto it = data.begin(); it != data.end(); ++it) {
        std::cout << *it << " ";
    }

    std::cout << "\n역방향 출력: ";
    for (auto it = data.rbegin(); it != data.rend(); ++it) {
        std::cout << *it << " ";
    }

    return 0;
}

출력 결과

정방향 출력: 1 2 3 4 5
역방향 출력: 5 4 3 2 1

어떤 상황에서 각각을 사용하면 좋은가?

begin()과 end()가 유리한 경우

  • 데이터를 처음부터 끝까지 순서대로 처리해야 할 때
  • 정렬된 데이터를 앞에서부터 순차 탐색할 때
  • 컨테이너에 삽입된 순서대로 출력이 필요할 때

rbegin()과 rend()가 유리한 경우

  • 최근에 추가된 데이터부터 먼저 접근해야 할 때 (예: 최신 뉴스, 댓글 등)
  • 데이터를 내림차순으로 처리할 때
  • 거꾸로 탐색이 필요한 알고리즘에서 (예: 뒤에서 조건을 찾는 경우)
  • 스택 또는 덱의 뒤쪽 요소 중심 처리 시

auto, rbegin(), rend()를 함께 쓰는 이유

rbegin()이나 rend()는 reverse_iterator라는 자료형을 반환하는데, 이 자료형 이름이 길고 복잡합니다.

예를 들어 다음과 같이 선언하면 매우 길고 보기 어렵습니다.

std::vector<int>::reverse_iterator it = vec.rbegin();

하지만 auto를 활용하면 자료형을 자동으로 추론해주기 때문에 훨씬 간결하게 쓸 수 있습니다.

auto it = vec.rbegin();

이렇게 하면 코드가 짧고 이해하기 쉬우며, 자료형이 바뀌어도 문제없이 사용할 수 있습니다.


결론

  • auto는 자료형을 자동으로 추론하여 코드를 간결하게 만들어줍니다.
  • rbegin()과 rend()는 컨테이너를 뒤에서부터 순회할 수 있게 도와줍니다.
  • begin()과 end()는 앞에서부터 순회할 때 사용합니다.
  • 반복자 자료형이 복잡할수록 auto를 활용하면 코드의 가독성과 유지보수성이 향상됩니다.

 

'Language > C++' 카테고리의 다른 글

c++란?  (0) 2025.04.29
vector  (0) 2025.03.20