C++의 std::set은 자동으로 오름차순 정렬되는 연관 컨테이너입니다. 그렇다면 이 세트를 역방향(내림차순)으로 순회하려면 어떻게 해야 할까요?
예를 들어 세트가 S = [10, 15, 26, 30, 35, 40, 48, 87, 98]과 같다면, 역방향 순회 시 출력 결과는 다음과 같아야 합니다.
98 87 48 40 35 30 26 15 10
역방향 순회의 핵심: reverse_iterator
세트를 역순으로 탐색하려면 역방향 반복자(reverse_iterator)를 사용하면 됩니다. 이때 rbegin()과 rend() 함수를 활용하는데, 각 함수의 역할은 다음과 같습니다.
- rbegin(): 역방향 순회의 시작점, 즉 컨테이너의 마지막 요소를 가리킵니다.
- rend(): 역방향 순회의 끝점, 즉 첫 번째 요소 앞의 위치를 가리킵니다.
예제 코드
아래 예제에서는 같은 세트를 정방향과 역방향으로 각각 순회하여 결과를 비교해 봅니다.
#include <iostream>
#include <set>
using namespace std;
int main() {
int arr[] = {10, 15, 26, 30, 35, 40, 48, 87, 98};
set<int> my_set(arr, arr + sizeof(arr) / sizeof(arr[0]));
set<int>::iterator it;
cout << "정방향 순회 결과: ";
for (it = my_set.begin(); it != my_set.end(); it++)
cout << *it << " ";
set<int>::reverse_iterator rev_it;
cout << "\n역방향 순회 결과: ";
for (rev_it = my_set.rbegin(); rev_it != my_set.rend(); rev_it++)
cout << *rev_it << " ";
return 0;
}실행 결과
정방향 순회 결과: 10 15 26 30 35 40 48 87 98 역방향 순회 결과: 98 87 48 40 35 30 26 15 10
추가 팁
C++11 이상을 사용한다면 범위 기반 for문과 함께 auto 키워드를 활용해 코드를 더 간결하게 작성할 수도 있습니다.
for (auto rev_it = my_set.rbegin(); rev_it != my_set.rend(); ++rev_it)
cout << *rev_it << " ";이처럼 rbegin()과 rend()만 기억하면 별도의 정렬 작업 없이도 세트의 요소를 손쉽게 내림차순으로 출력할 수 있습니다.