개발자공부일기
C++ auto, rbegin, rend - STL 반복자를 더 쉽게 이해하는 방법 본문
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를 활용하면 코드의 가독성과 유지보수성이 향상됩니다.