이 글에서는 C++ STL에서 덱(deque)의 crend() 함수가 어떤 기능을 수행하는지 예제와 함께 자세히 살펴보겠습니다.
덱(Deque)이란?
덱(Double Ended Queue, 데크)은 양쪽 끝(front와 back)에서 모두 데이터의 삽입과 삭제, 즉 확장과 축소가 가능한 시퀀스 컨테이너입니다. 일반적인 큐(queue) 자료구조는 데이터를 뒤(rear)에만 삽입할 수 있고 앞(front)에서만 삭제할 수 있습니다. 버스 정류장의 줄을 예로 들어 보면, 새로 온 사람은 줄의 맨 뒤에만 추가되고 맨 앞에 서 있는 사람이 가장 먼저 탑승하게 됩니다. 반면 양방향 큐인 덱은 이름 그대로 양쪽 끝 어느 쪽에서든 데이터를 넣고 뺄 수 있습니다.
덱의 crend() 함수는 덱의 첫 번째 요소 바로 앞 위치를 가리키는 const_reverse_iterator(읽기 전용 역방향 반복자)를 반환하며, 이 위치는 역방향 순회의 '끝(reverse end)'으로 간주됩니다.
문법(Syntax)
deque_name.crend()
반환 값(Return Value)
crend() 함수는 해당 덱의 const_reverse_iterator를 반환합니다.
예시
입력 — Deque: 5 4 3 2 1
출력 — 역순 Deque: 1 2 3 4 5
입력 — Deque: 75 45 33 77 12
출력 — 역순 Deque: 12 77 33 45 75
접근 방법
- 먼저 덱을 선언합니다.
- 그다음 덱의 내용을 순서대로 출력합니다.
- 마지막으로 crend() 함수를 활용해 덱을 역순으로 순회합니다.
위 접근 방식을 따르면 덱의 전체 요소를 역순으로 손쉽게 출력할 수 있습니다.
예제 코드 1
// C++ 코드로 살펴보는 deque crend() 함수의 동작
#include <iostream>
#include <deque>
using namespace std;
int main() {
// 덱 선언
deque<int> dq = { 5, 4, 3, 2, 1 };
// 덱 출력
cout << "Deque: ";
for (auto x = dq.begin(); x != dq.end(); ++x)
cout << *x << " ";
// 덱을 역순으로 출력
cout << "\n역순 Deque: ";
for (auto x = dq.crbegin(); x != dq.crend(); ++x)
cout << *x << " ";
return 0;
}
출력 결과
위 코드를 실행하면 다음과 같은 결과가 출력됩니다.
입력 — Deque: 5 4 3 2 1 출력 — 역순 Deque: 1 2 3 4 5
예제 코드 2
// C++ 코드로 살펴보는 crend() 함수의 동작
#include <iostream>
#include <deque>
using namespace std;
int main() {
deque<char> dq = { 'L', 'A', 'P', 'T', 'O', 'P' };
cout << "Deque: ";
for (auto x = dq.begin(); x != dq.end(); ++x)
cout << *x << " ";
// 덱을 역순으로 출력
cout << "\n역순 Deque: ";
for (auto x = dq.crbegin(); x != dq.crend(); ++x)
cout << *x << " ";
return 0;
}
출력 결과
위 코드를 실행하면 다음과 같은 결과가 출력됩니다.
입력 — Deque: L A P T O P 출력 — 역순 Deque: P O T P A L
참고: crend()와 함께 알아두면 좋은 함수들
- rbegin() — 마지막 요소를 가리키는 역방향 반복자를 반환합니다.
- rend() — 첫 번째 요소 앞을 가리키는 역방향 반복자를 반환합니다.
- crbegin() — 읽기 전용(const) 역방향 반복자로 마지막 요소를 가리킵니다.
- crend() — 읽기 전용 역방향 반복자로 첫 번째 요소 앞을 가리킵니다.
crend()는 crbegin()과 짝을 이루어 사용되며, 덱의 내용을 수정하지 않고 안전하게 역순 순회만 필요로 할 때 특히 유용합니다.