C++11에서 도입된 범위 기반 for 루프(range-based for loop)는 컨테이너의 요소를 간결하게 순회할 수 있게 해주는 편리한 문법입니다. 하지만 표준 C++11에는 이 루프를 역방향(뒤집힌 순서)으로 순회하는 기능이 기본적으로 제공되지 않습니다.
이러한 한계를 해결하기 위해 널리 사용되는 Boost 라이브러리를 활용할 수 있습니다. Boost는 강력하고 검증된 다양한 기능을 제공하는 오픈소스 C++ 라이브러리 모음으로, 그중 boost::adaptors::reverse()를 사용하면 배열이나 컨테이너를 별도의 복사 없이 역순으로 순회할 수 있습니다.
사용 방법
핵심은 헤더 파일 <boost/range/adaptor/reversed.hpp>를 포함시키고, 범위 기반 for 루프의 컨테이너 자리에 boost::adaptors::reverse(x)를 전달하는 것입니다. 원본 컨테이너는 변경되지 않으며, 읽기 전용 어댑터로 감싸진 형태로 역순 접근이 가능합니다.
예제 코드
#include <list>
#include <iostream>
#include <boost/range/adaptor/reversed.hpp>
using namespace std;
int main() {
std::list<int> x {11, 44, 77, 55, 44, 22, 33, 30, 88, 99, 55, 44};
cout << "Normal Loop" << endl;
for (auto i : x)
std::cout << i << '\n';
cout << "Reversed Loop" << endl;
for (auto i : boost::adaptors::reverse(x))
std::cout << i << '\n';
}실행 결과
Normal Loop 11 44 77 55 44 22 33 30 88 99 55 44 Reversed Loop 44 55 99 88 30 33 22 44 55 77 44 11
참고 사항
- 원본 데이터 보존:
boost::adaptors::reverse()는 새로운 컨테이너를 생성하지 않고 기존 컨테이너를 역순으로 참조하므로, 복사 비용이 발생하지 않아 성능 면에서 효율적입니다. - 다양한 컨테이너 지원:
std::vector,std::list, 일반 배열 등 반복자를 지원하는 대부분의 컨테이너에 적용할 수 있습니다. - C++20 대안: 최신 표준을 사용할 수 있는 환경이라면 C++20에서 도입된
std::ranges::views::reverse를 사용하여 Boost 의존성 없이 동일한 기능을 구현할 수도 있습니다.
이처럼 Boost의 range adaptor를 활용하면 C++11 환경에서도 가독성 높은 역방향 순회 코드를 손쉽게 작성할 수 있습니다.