Namespaces
Variants

Ranges library (since C++20)

From cppreference.net
Ranges library
Range adaptors

범위 라이브러리는 알고리즘과 반복자 라이브러리의 확장 및 일반화로, 이를 구성 가능하게 하고 오류 발생 가능성을 줄여 더욱 강력하게 만듭니다.

이 라이브러리는 반복 가능한 시퀀스( ranges )를 간접적으로 표현하는 경량 객체인 범위 views 를 생성하고 조작합니다. 범위는 상위 레벨의 추상화 개념으로

  • [ begin , end ) – 반복자 쌍, 예를 들어 컨테이너에서 암시적 변환으로 생성된 범위. 반복자 쌍을 받는 모든 알고리즘은 이제 범위를 받는 오버로드를 갖습니다 (예: ranges::sort )
  • begin + [ 0 , size ) – 카운트된 시퀀스, 예를 들어 views::counted 가 반환하는 범위
  • [ begin , predicate ) – 조건부 종료 시퀀스, 예를 들어 views::take_while 가 반환하는 범위
  • [ begin , .. ) – 무한 시퀀스, 예를 들어 views::iota 가 반환하는 범위

ranges 라이브러리는 range algorithms range adaptors 를 포함합니다. range algorithms은 범위에 즉시 적용되고, range adaptors는 뷰에 지연 적용됩니다. 어댑터는 파이프라인으로 구성될 수 있어 뷰가 순회될 때 해당 동작이 수행됩니다.

헤더에 정의됨 <ranges>
namespace std {

namespace views = ranges :: views ;

}
(C++20부터)

네임스페이스 별칭 std::views std::ranges::views 의 약칭으로 제공됩니다.

네임스페이스 std::ranges 에 정의됨

목차

범위 접근
헤더에 정의됨 <ranges>
헤더 파일에 정의됨 <iterator>
범위의 시작 부분을 가리키는 반복자를 반환함
(커스터마이제이션 포인트 객체)
범위의 끝을 나타내는 센티널을 반환합니다
(커스터마이제이션 포인트 객체)
읽기 전용 범위의 시작 부분을 가리키는 반복자를 반환함
(커스터마이제이션 포인트 객체)
읽기 전용 범위의 끝을 나타내는 sentinel을 반환합니다
(커스터마이제이션 포인트 객체)
범위의 역방향 반복자를 반환합니다
(커스터마이제이션 포인트 객체)
범위의 역방향 끝 반복자를 반환합니다
(커스터마이제이션 포인트 객체)
읽기 전용 범위에 대한 역방향 반복자를 반환합니다
(커스터마이제이션 포인트 객체)
읽기 전용 범위에 대한 역방향 끝 반복자를 반환합니다
(커스터마이제이션 포인트 객체)
범위가 제공하는 예약 힌트와 동일한 정수를 반환합니다
(커스터마이제이션 포인트 객체)
범위의 크기와 동일한 정수를 반환합니다
(커스터마이제이션 포인트 객체)
범위의 크기와 동일한 부호 있는 정수를 반환합니다
(커스터마이제이션 포인트 객체)
범위가 비어 있는지 여부를 확인합니다
(커스터마이제이션 포인트 객체)
연속 범위의 시작 부분에 대한 포인터를 획득함
(커스터마이제이션 포인트 객체)
읽기 전용 연속 범위의 시작 부분에 대한 포인터를 획득합니다
(커스터마이제이션 포인트 객체)
범위 기본 요소
헤더에 정의됨 <ranges>
범위의 반복자 및 센티넬 타입을 얻음
(alias template)
범위의 크기, 차이 및 값 타입을 획득
(별칭 템플릿)
범위의 참조 타입들을 획득함
(별칭 템플릿)
댕글링 반복자 처리
헤더에 정의됨 <ranges>
댕글링 상태가 될 것이므로 반환되어서는 안 되는 반복자나 subrange 를 나타내는 플레이스홀더 타입
(클래스)
borrowed_range 의 반복자 타입 또는 subrange 타입을 획득함
(alias template)
기타 유틸리티
헤더에 정의됨 <ranges>
범위를 단일 값이 아닌 시퀀스로 처리하도록 태그 지정
(클래스 템플릿)
Range 개념
헤더에 정의됨 <ranges>
타입이 범위(range)임을 명시합니다. 즉, begin 반복자와 end 센티넬을 제공함
(concept)
해당 타입이 range 임을 명시하고, 해당 타입의 표현식에서 얻은 반복자들이 댕글링(dangling)의 위험 없이 안전하게 반환될 수 있음을 지정함
(concept)
범위가 상수 시간에 크기를 추정할 수 있음을 명시
(concept)
범위가 자신의 크기를 상수 시간에 알 수 있음을 지정함
(concept)
범위가 뷰임을 지정합니다. 즉, 상수 시간 복사/이동/할당을 가짐
(concept)
반복자 타입이 input_iterator 를 만족하는 범위를 지정함
(concept)
반복자 타입이 output_iterator 를 만족하는 범위를 지정함
(컨셉)
반복자 타입이 forward_iterator 를 만족하는 범위를 명시함
(컨셉)
반복자 타입이 bidirectional_iterator 를 만족하는 범위를 지정함
(컨셉)
반복자 타입이 random_access_iterator 를 만족하는 범위를 명시합니다
(컨셉)
반복자 타입이 contiguous_iterator 를 만족하는 범위를 명시합니다
(컨셉)
범위가 동일한 반복자와 센티넬 타입을 가짐을 명시
(컨셉)
range view 로 안전하게 변환될 수 있는 요구 사항을 명시함
(concept)
범위가 읽기 전용 요소를 가짐을 명시
(concept)
범위 변환
헤더에 정의됨 <ranges>
(C++23)
입력 범위로부터 새로운 non-view 객체를 생성합니다
(function template)
헤더에 정의됨 <ranges>
view 를 정의하기 위한 도우미 클래스 템플릿, curiously recurring template pattern 을 사용함
(클래스 템플릿)
반복자-센티널 쌍을 view 로 결합합니다
(클래스 템플릿)

레인지 팩토리

헤더에 정의됨 <ranges>
네임스페이스에 정의됨 std::ranges
요소가 없는 빈 view
(클래스 템플릿) (변수 템플릿)
지정된 값을 가진 단일 요소를 포함하는 view
(클래스 템플릿) (커스터마이제이션 포인트 객체)
초기값을 반복적으로 증가시켜 생성된 시퀀스로 구성된 view
(클래스 템플릿) (커스터마이제이션 포인트 객체)
동일한 값을 반복적으로 생성하여 만들어진 시퀀스로 구성된 view
(클래스 템플릿) (커스터마이제이션 포인트 객체)
연관된 입력 스트림에 operator>> 를 연속적으로 적용하여 얻은 요소들로 구성된 view
(클래스 템플릿) (커스터마이제이션 포인트 객체)

범위 어댑터

헤더에 정의됨 <ranges>
네임스페이스 std::ranges 에 정의됨
범위 어댑터 클로저 객체를 정의하기 위한 헬퍼 베이스 클래스 템플릿
(클래스 템플릿)
range 의 모든 요소를 포함하는 view
(alias template) (range adaptor object)
다른 range 의 원소들을 참조하는 view
(클래스 템플릿)
어떤 view 의 유일한 소유권을 가지는 range
(클래스 템플릿)
각 요소를 rvalue로 캐스팅하는 시퀀스의 view
(클래스 템플릿) (레인지 어댑터 객체)
조건자를 만족하는 range 의 요소들로 구성된 view
(클래스 템플릿) (range adaptor object)
각 요소에 변환 함수를 적용하는 시퀀스의 view
(클래스 템플릿) (레인지 어댑터 객체)
다른 view 의 첫 N개 요소로 구성된 view
(클래스 템플릿) (레인지 어댑터 객체)
다른 view 의 초기 요소들로 구성된 view 로, 술어(predicate)가 false 를 반환하는 첫 번째 요소까지 포함
(클래스 템플릿) (범위 어댑터 객체)
다른 view 의 요소들로 구성되며, 처음 N개 요소를 건너뛴 view
(클래스 템플릿) (범위 어댑터 객체)
다른 view 의 요소들로 구성되며, 술어(predicate)가 false 를 반환하는 첫 번째 요소까지의 초기 부분 시퀀스를 건너뛴 view
(클래스 템플릿) (범위 어댑터 객체)
view 의 시퀀스를 평탄화하여 얻은 시퀀스로 구성된 view
(클래스 템플릿) (범위 어댑터 객체)
범위의 뷰를 평탄화하여 얻은 시퀀스로 구성된 view (요소 사이에 구분자가 있음)
(클래스 템플릿) (범위 어댑터 객체)
다른 view 를 구분자로 분할하여 얻은 부분 범위에 대한 view
(클래스 템플릿) (범위 어댑터 객체)
다른 view 를 구분자로 분할하여 얻은 부분 범위에 대한 view
(클래스 템플릿) (범위 어댑터 객체)
적응된 뷰들의 연결로 구성된 view
(클래스 템플릿) (커스터마이제이션 포인트 객체)
반복자와 개수로부터 서브레인지를 생성합니다
(커스터마이제이션 포인트 객체)
view common_range 로 변환합니다
(클래스 템플릿) (레인지 어댑터 객체)
다른 양방향 view 의 요소들을 역순으로 순회하는 view
(클래스 템플릿) (레인지 어댑터 객체)
view constant_range 로 변환합니다
(클래스 템플릿) (범위 어댑터 객체)
view 로 구성된 tuple-like 값과 숫자 N을 취하여 각 튜플의 N th 번째 요소로 구성된 view 를 생성함
(클래스 템플릿) (레인지 어댑터 객체)
pair-like 값들로 구성된 view 를 취하여 각 pair의 첫 번째 요소들로 이루어진 view 를 생성함
(클래스 템플릿) (range adaptor 객체)
pair-like 값들로 구성된 view 를 취하고 각 pair의 두 번째 요소들로 이루어진 view 를 생성함
(클래스 템플릿) (레인지 어댑터 객체)
적응된 시퀀스의 각 요소를 요소의 위치와 값 모두를 포함하는 튜플로 매핑하는 view
(클래스 템플릿) (레인지 어댑터 객체)
적응된 뷰들의 해당 요소들에 대한 참조의 튜플로 구성된 view
(클래스 템플릿) (커스터마이제이션 포인트 객체)
변환 함수를 적용된 뷰들의 해당 요소들에 적용한 결과로 구성된 view
(클래스 템플릿) (커스터마이제이션 포인트 객체)
적응된 뷰의 인접한 요소들에 대한 참조의 튜플로 구성된 view
(클래스 템플릿) (범위 어댑터 객체)
적응된 뷰의 인접한 요소들에 변환 함수를 적용한 결과로 구성된 view
(클래스 템플릿) (범위 어댑터 객체)
다른 view 의 요소들을 N 크기의 겹치지 않는 연속적인 청크로 나눈 view 의 범위
(클래스 템플릿) (범위 어댑터 객체)
다른 view 의 M th 번째부터 (M + N - 1) th 번째 요소들에 대한 view 인 M th 번째 요소를 가진 view
(클래스 템플릿) (레인지 어댑터 객체)
주어진 조건자가 false 를 반환하는 각 인접 요소 쌍 사이에서 view 를 부분 범위로 분할합니다
(클래스 템플릿) (범위 어댑터 객체)
다른 view 의 요소들로 구성되며, 한 번에 N개 요소씩 건너뛰는 view
(클래스 템플릿) (레인지 어댑터 객체)
적응된 뷰들의 n-ary 카테시안 곱으로 계산된 결과의 튜플로 구성된 view
(클래스 템플릿) (커스터마이제이션 포인트 객체)
기본 시퀀스의 마지막으로 접근된 요소를 캐시하는 view
(클래스 템플릿) (range adaptor object)
view input_range 전용이면서 common_range 가 아닌 범위로 변환합니다
(클래스 템플릿) (범위 어댑터 객체)

범위 생성기 (C++23부터)

헤더에 정의됨 <generator>
네임스페이스에 정의됨 std
(C++23)
동기식 코루틴 generator를 나타내는 view
(클래스 템플릿)

헬퍼 항목

범위 어댑터 객체

RangeAdaptorObject (RAO)를 참조하십시오.

범위 어댑터 클로저 객체

RangeAdaptorClosureObject (RACO)를 참조하십시오.

커스터마이제이션 포인트 객체

Customization point object (CPO)를 참조하십시오.

할당 가능 래퍼

일부 범위 어댑터는 해당 요소나 함수 객체를 copyable-box (until C++23) movable-box (since C++23) 로 래핑합니다. 이 래퍼는 필요한 경우 래핑된 객체에 할당 가능성을 부여합니다.

비전파 캐시

일부 범위 어댑터는 설명 전용 클래스 템플릿인 non-propagating-cache 를 기반으로 명세되며, 이는 거의 std:: optional < T > 와 유사하게 동작합니다(차이점에 대한 설명 참조).

조건부- const 타입

template < bool Const, class T >
using /*maybe-const*/ = std:: conditional_t < Const, const T, T > ;
( 설명 전용* )

별칭 템플릿 /*maybe-const*/ 는 타입 T 에 조건부로 const 한정자를 적용하기 위해 사용되는 축약 표현입니다.

정수형 유사 타입 헬퍼 템플릿

template < /*is-integer-like*/ T >
using /*make-signed-like-t*/ < T > = /* 설명 참조 */ ;
(1) ( 설명 전용* )
template < /*is-integer-like*/ T >
using /*make-unsigned-like-t*/ < T > = /* 설명 참조 */ ;
(2) ( 설명 전용* )
template < /*is-integer-like*/ T >

/*make-unsigned-like-t*/ < T > /*to-unsigned-like*/ ( T t )
{
return static_cast < /*make-unsigned-like-t*/ < T >> ( t ) ;

}
(3) ( 설명 전용* )
1) 정수형 유사 타입 T 에 대해:
  • T 가 정수 타입인 경우, /*make-signed-like-t*/ < T > std:: make_signed_t < T > 입니다.
  • 그렇지 않은 경우, /*make-signed-like-t*/ < T > T 와 동일한 너비를 가지는 해당하는 지정되지 않은 부호 있는 정수형 유사 타입입니다.
2) 정수형과 유사한 타입 T 에 대해:
  • 만약 T 가 정수 타입인 경우, /*make-unsigned-like-t*/ < T > std:: make_unsigned_t < T > 입니다.
  • 그렇지 않은 경우, /*make-unsigned-like-t*/ < T > T 와 동일한 너비를 가지는 해당하는 지정되지 않은 부호 없는 정수형과 유사한 타입입니다.
3) t /*make-unsigned-like-t*/ < T > 로 명시적으로 변환합니다.

커스터마이제이션 포인트 객체 헬퍼

template < ranges:: input_range R >

constexpr auto & /*possibly-const-range*/ ( R & r ) noexcept
{
if constexpr ( ranges:: input_range < const R > )
return const_cast < const R & > ( r ) ;
else
return r ;

}
(1) ( 설명 전용* )
template < class T >

constexpr auto /*as-const-pointer*/ ( const T * p ) noexcept
{
return p ;

}
(2) ( 설명 전용* )

일부 범위 접근 사용자 지정 지점 객체는 이러한 설명 전용 함수 템플릿을 기준으로 명세됩니다.

1) /*possibly-const-range*/ input_range 를 만족하는 경우 const R r 의 const 한정 버전을 반환합니다; 그렇지 않은 경우에는 아무 캐스팅 없이 r 을 반환합니다.
2) /*as-const-pointer*/ 상수 타입 객체에 대한 포인터를 반환합니다.

범위 어댑터 헬퍼

template < class F, class Tuple >

constexpr auto /*tuple-transform*/ ( F && f, Tuple && tuple )
{
return std:: apply ( [ & ] < class ... Ts > ( Ts && ... args )
{
return std:: tuple < std:: invoke_result_t < F & , Ts > ... >
( std:: invoke ( f, std:: forward < Ts > ( args ) ) ... ) ;
} , std:: forward < Tuple > ( tuple ) ) ;

}
(1) ( 설명 전용* )
template < class F, class Tuple >

constexpr void /*튜플-각각-적용*/ ( F && f, Tuple && tuple )
{
std:: apply ( [ & ] < class ... Ts > ( Ts && ... args )
{
( static_cast < void > ( std:: invoke ( f, std:: forward < Ts > ( args ) ) ) , ... ) ;
} , std:: forward < Tuple > ( tuple ) ) ;

}
(2) ( 설명 전용* )
template < class T >

constexpr T & /*as-lvalue*/ ( T && t )
{
return static_cast < T & > ( t ) ;

}
(3) ( 설명 전용* )

일부 범위 어댑터는 이러한 전시용 함수 템플릿을 기준으로 명세됩니다.

1) /*tuple-transform*/ tuple 의 각 요소에 f 를 적용하여 생성된 새로운 튜플을 반환합니다.
2) /*tuple-for-each*/ f tuple 의 각 요소에 적용하고 아무것도 반환하지 않습니다.
3) /*as-lvalue*/ rvalue를 t 로서 lvalue로 전달합니다.

헬퍼 개념

다음 설명 전용 개념들은 여러 타입에 사용되지만, 표준 라이브러리의 인터페이스 일부는 아닙니다.

template < class R >

concept /*단순 뷰*/ =
ranges:: view < R > && ranges:: range < const R > &&
std:: same_as < ranges:: iterator_t < R > , ranges:: iterator_t < const R >> &&

std:: same_as < ranges:: sentinel_t < R > , ranges:: sentinel_t < const R >> ;
(1) ( 설명 전용* )
template < class I >

concept /*has-arrow*/ =
ranges :: input_iterator < I > &&

( std:: is_pointer_v < I > || requires ( const I i ) { i. operator - > ( ) ; } ) ;
(2) ( 설명 전용* )
template < class T, class U >

concept /*different-from*/ =

! std:: same_as < std:: remove_cvref_t < T > , std:: remove_cvref_t < U >> ;
(3) ( 설명 전용* )
template < class R >

concept /*이동-가능-참조를-가진-범위*/ =
ranges:: input_range < R > &&
std:: move_constructible < ranges:: range_reference_t < R >> &&

std:: move_constructible < ranges:: range_rvalue_reference_t < R >> ;
(4) ( 설명 전용* )
template < bool C, class ... Views >

concept /*all-random-access*/ =
( ranges:: random_access_range

< std:: conditional_t < C, const Views, Views >> && ... ) ;
(5) ( 설명 전용* )
template < bool C, class ... Views >

concept /*all-bidirectional*/ =
( ranges:: bidirectional_range

< std:: conditional_t < C, const Views, Views >> && ... ) ;
(6) ( 설명 전용* )
template < bool C, class ... Views >

concept /*모두-전방*/ =
( ranges:: forward_range

< std:: conditional_t < C, const Views, Views >> && ... ) ;
(7) ( 설명 전용* )

참고 사항

기능 테스트 매크로 표준 기능
__cpp_lib_generator 202207L (C++23) std:: generator – 범위를 위한 동기 코루틴 생성기
__cpp_lib_ranges 201911L (C++20) Ranges 라이브러리 및 제약된 알고리즘
202106L (C++23)
(DR20)
기본 초기화 불가능한 default-initializable views
202110L (C++23)
(DR20)
Views with ownership
202202L (C++23) ranges:: range_adaptor_closure
202207L (C++23) 범위 어댑터 가 이동 전용 타입을 허용하도록 완화
202211L (C++23) "poison pills" 오버로드 제거 (P2602) in ranges:: begin etc
202302L (C++23) 특정 프로젝션을 허용하도록 범위 완화
202406L (C++26)
(DR20)
간접 호출 가능 개념들에서 공통 참조 요구사항 제거
__cpp_lib_ranges_as_const 202207L (C++23) std:: const_iterator , ranges:: as_const_view
__cpp_lib_ranges_as_rvalue 202207L (C++23) ranges:: as_rvalue_view
__cpp_lib_ranges_cache_latest 202411L (C++26) ranges :: cache_latest_view
__cpp_lib_ranges_cartesian_product 202207L (C++23) ranges:: cartesian_product_view
__cpp_lib_ranges_chunk 202202L (C++23) ranges:: chunk_view
__cpp_lib_ranges_chunk_by 202202L (C++23) ranges:: chunk_by_view
__cpp_lib_ranges_concat 202403L (C++26) ranges:: concat_view
__cpp_lib_ranges_enumerate 202302L (C++23) ranges :: enumerate_view
__cpp_lib_ranges_join_with 202202L (C++23) ranges:: join_with_view
__cpp_lib_ranges_repeat 202207L (C++23) ranges:: repeat_view
__cpp_lib_ranges_reserve_hint 202502L (C++26) ranges :: reserve_hint ranges :: approximately_sized_range
__cpp_lib_ranges_slide 202202L (C++23) ranges:: slide_view
__cpp_lib_ranges_stride 202207L (C++23) ranges:: stride_view
__cpp_lib_ranges_to_container 202202L (C++23) ranges:: to
__cpp_lib_ranges_to_input 202502L (C++26) ranges :: to_input_view
__cpp_lib_ranges_zip 202110L (C++23) ranges:: zip_view ,
ranges:: zip_transform_view ,
ranges:: adjacent_view ,
ranges:: adjacent_transform_view

예제

#include <iostream>
#include <ranges>
int main()
{
    auto const ints = {0, 1, 2, 3, 4, 5};
    auto even = [](int i) { return 0 == i % 2; };
    auto square = [](int i) { return i * i; };
    // 뷰를 구성하는 "파이프" 구문:
    for (int i : ints | std::views::filter(even) | std::views::transform(square))
        std::cout << i << ' ';
    std::cout << '\n';
    // 전통적인 "함수형" 구성 구문:
    for (int i : std::views::transform(std::views::filter(ints, even), square))
        std::cout << i << ' ';
}

출력:

0 4 16
0 4 16

결함 보고서

다음의 동작 변경 결함 보고서들은 이전에 발표된 C++ 표준에 소급 적용되었습니다.

DR 적용 대상 게시된 동작 올바른 동작
LWG 3509
( P2281R1 )
C++20 범위 어댑터 객체가 후행 인수를 어떻게 바인딩하는지 불분명했음 값으로 바인딩됨
LWG 3948 C++23 possibly-const-range as-const-pointer
noexcept 로 선언되지 않았음
noexcept 로 선언됨
LWG 4027 C++23 possibly-const-range 가 이미 constant_range 를 모델링한 범위에 대해
const 한정자를 추가하지 않았음
해당 범위에 대해 const 한정자를 추가함
LWG 4112 C++20 has-arrow i 가 const-qualified되어야 한다고 요구하지 않았음 요구함

참고 항목