Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

C++11 역방향 범위 기반 for 루프 – boost::adaptors::reverse() 활용법

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 환경에서도 가독성 높은 역방향 순회 코드를 손쉽게 작성할 수 있습니다.