이 글에서는 C++ STL에서 Deque의 rend() 함수가 어떤 기능을 하는지 예제와 함께 자세히 살펴보겠습니다.
Deque(덱)란 무엇인가?
Deque(Double Ended Queue, 덱)는 양쪽 끝에서 모두 요소를 추가하거나 제거할 수 있는 시퀀스 컨테이너입니다. 일반적인 큐(Queue) 자료구조는 데이터를 뒤쪽(END)에만 삽입하고 앞쪽(FRONT)에서만 삭제할 수 있습니다. 버스 정류장 줄에 비유하면, 사람은 맨 뒤에서만 줄에 설 수 있고 맨 앞에 선 사람이 가장 먼저 나가게 됩니다.
반면 덱은 이름 그대로 '양방향 큐'이기 때문에 앞쪽과 뒤쪽 어느 쪽에서든 데이터의 삽입과 삭제가 가능하다는 점이 가장 큰 특징입니다.
rend() 함수란?
rend() 함수는 deque 컨테이너의 첫 번째 요소 바로 앞 위치를 가리키는 역방향 반복자(reverse iterator)를 반환합니다. 즉, 역방향 순회의 '끝'을 표시하는 역할을 하며, rbegin()부터 rend()까지 순회하면 요소들이 역순으로 방문됩니다.
문법: deque_name.rend()
반환값: deque의 첫 번째 요소 이전 위치를 가리키는 역방향 반복자(const_reverse_iterator)
예제
입력 Deque: 5 4 4 2 0
출력 역순 Deque: 0 2 4 4 5
입력 Deque: R E C T I F I E R
출력 역순 Deque: R E I F I T C E R
구현 접근 방법
- 먼저 deque를 선언하고 초기화합니다.
begin()부터end()까지 순회하며 원본 deque를 출력합니다.rbegin()부터rend()까지 순회하여 역순 deque를 출력합니다.- 두 결과를 비교해 역순 순회가 올바르게 동작했는지 확인합니다.
위 접근 방식을 따르면 deque의 역순 출력을 손쉽게 구현할 수 있습니다.
예제 1: 정수형 deque
// deque rend() 함수의 동작을 보여주는 C++ 코드
#include <iostream>
#include <deque>
using namespace std;
int main() {
// deque 초기화
deque<int> deq = { 7, 4, 0, 3, 7 };
// 원본 deque 출력
cout << "Deque: ";
for (auto x = deq.begin(); x != deq.end(); ++x)
cout << *x << " ";
// 역방향 deque 출력
cout << "\n역방향 Deque: ";
for (auto x = deq.rbegin(); x != deq.rend(); ++x)
cout << *x << " ";
return 0;
}
실행 결과
Deque: 7 4 0 3 7 역방향 Deque: 7 3 0 4 7
위 코드를 실행하면 원본 deque는 입력 순서대로 출력되고, rbegin()과 rend()를 사용한 순회 결과는 정확히 반대 순서로 출력되는 것을 확인할 수 있습니다.
예제 2: 문자형 deque
// 문자 deque에서 rend() 함수 활용 예제
#include <iostream>
#include <deque>
using namespace std;
int main() {
// deque 초기화
deque<char> deq = { 'S', 'U', 'B', 'T', 'R', 'A', 'C', 'T' };
cout << "Deque: ";
for (auto x = deq.begin(); x != deq.end(); ++x)
cout << *x << " ";
// 역방향 deque 출력
cout << "\n역방향 Deque: ";
for (auto x = deq.rbegin(); x != deq.rend(); ++x)
cout << *x << " ";
return 0;
}
실행 결과
Deque: S U B T R A C T 역방향 Deque: T C A R T B U S
핵심 정리
rend()는 역방향 반복자의 끝 지점을 나타내며, 실제로 deque 자체를 뒤집는 것이 아니라 역순으로 순회할 때의 종료 조건 역할을 합니다. rbegin()과 rend()를 한 쌍으로 사용하면 별도의 복사나 정렬 없이도 컨테이너의 모든 요소를 역순으로 처리할 수 있어, 최신 요소부터 우선적으로 다뤄야 하는 상황에서 특히 유용합니다.