원소의 처음부터 끝까지 간편하게 접근할 수 있는 Range-based for문에 대해 알아보자
for (
for-ranged-declaration:
expression)
statement
Range-based for문은 expression
의 처음부터 끝까지의 원소에 각각에 대해 순차적으로 접근하여 statement
를 실행하는 것이다.
for-ranged-declaration
부분에 선언된 변수는 for문의 로컬 변수이며 expression
이나 statement
에서 재선언될 수 없다. 주로 auto
키워드를 사용하여 선언하는데 자세한 사용 예시는 밑에서 알아보도록 하자.
expression
부분에는 크기가 미리 정해진 배열이나 vector
, map
과 같은 범위가 begin()과 end()로 정의된 C++ standard library 컨테이너를 사용할 수 있다.
Visual Studio 2017 부터는 begin()
과 end()
가 같은 타입의 값을 리턴하지 않아도 Range-base for문을 사용할 수 있다. 즉, end()
가 Ranges-V3 라이브러리에서 정의된 센티넬 객체 같은 것을 리턴할 수 있는 것이다.
(Ranges-V3는 C++14/17/20에서 사용되는 range 라이브러리로 C++20의 std::ranges를 기반으로 하며, Sentinel value는 보통 반복문이나 재귀 알고리즘에서 종료 여부를 나타내는 특별한 값을 말한다. 따라서 Sentinel value는 일반적으로 해당 알고리즘의 정상적인 데이터 값에서는 절대 등장할 수 없는 값으로 선택한다)
참고로 break
, return
, goto
, continue
모두 일반 for문처럼 사용 가능하다.
포프TV - 내가 쓰는 C++11: Range-Based For
Microsoft Learn - Range-based for Statement (C++)
Wikipedia - Sentinel value
Carrot - while문에서 센티널sentinel 사용