Namespaces
Variants

std::ranges:: subrange

From cppreference.net
Ranges library
Range adaptors
헤더 파일에 정의됨 <ranges>
template <

std:: input_or_output_iterator I,
std:: sentinel_for < I > S = I,
ranges:: subrange_kind K = std:: sized_sentinel_for < S, I > ?
ranges :: subrange_kind :: sized :
ranges :: subrange_kind :: unsized >
requires ( K == ranges :: subrange_kind :: sized || ! std:: sized_sentinel_for < S, I > )
class subrange

: public ranges:: view_interface < subrange < I, S, K >>
(1) (C++20부터)
헬퍼 개념
template < class From, class To >

concept /*uses-nonqualification-pointer-conversion*/ =

/* 설명 참조 */ ;
(2) ( 설명 전용* )
template < class From, class To >
concept /*convertible-to-non-slicing*/ = /* 설명 참조 */ ;
(3) ( 설명 전용* )
1) subrange 클래스 템플릿은 반복자와 센티널을 단일 view 로 결합합니다. 이는 최종 템플릿 매개변수가 subrange_kind​ :: ​sized 일 때마다 sized_range 를 모델링합니다 (이는 std:: sized_sentinel_for < S, I > 가 만족되거나 크기가 생성자 인수로 명시적으로 전달될 때 발생합니다).
2) From qualification conversions 없이 To 로 변환 가능한지 여부를 결정합니다. 다음 코드와 동일합니다:
template<class From, class To>
concept /*uses-nonqualification-pointer-conversion*/ =
    std::is_pointer_v<From> && std::is_pointer_v<To> &&
        !std::convertible_to<std::remove_pointer_t<From>(*)[],
                             std::remove_pointer_t<To>(*)[]>;
3) From 이 파생-기반 변환 없이 To 로 변환 가능한지 결정합니다:
template<class From, class To>
concept /*convertible-to-non-slicing*/ =
    std::convertible_to<From, To> &&
        !/*uses-nonqualification-pointer-conversion*/
            <std::decay_t<From>, std::decay_t<To>>;

목차

데이터 멤버

멤버 정의
constexpr bool StoreSize [static] K == ranges :: subrange_kind :: sized &&
! std:: sized_sentinel_for < S, I >

( 설명 전용 정적 멤버 상수* )
I begin_ 서브레인지의 시작을 가리키는 반복자
( 설명 전용 멤버 객체* )
S end_ 서브레인지의 끝을 나타내는 센티널
( 설명 전용 멤버 객체* )
make-unsigned-like-t  < std:: iter_difference_t < I >> size_
( StoreSize true 인 경우에만 존재)
서브레인지의 크기
( 설명 전용 멤버 객체* )

멤버 함수

새로운 subrange 를 생성합니다
(public member function)
subrange pair-like 타입으로 변환합니다
(public member function)
Observers
반복자를 얻습니다
(public member function)
센티널을 얻습니다
(public member function)
subrange 가 비어 있는지 확인합니다
(public member function)
subrange 의 크기를 얻습니다
(public member function)
Iterator operations
주어진 거리만큼 반복자를 전진시킵니다
(public member function)
주어진 거리만큼 반복자가 감소된 subrange 의 복사본을 얻습니다
(public member function)
주어진 거리만큼 반복자가 전진된 subrange 의 복사본을 얻습니다
(public member function)
std::ranges::view_interface 로부터 상속됨
(C++23)
범위의 시작을 가리키는 상수 반복자를 반환합니다
( std::ranges::view_interface<D> 의 public member function)
(C++23)
범위의 상수 반복자에 대한 센티널을 반환합니다
( std::ranges::view_interface<D> 의 public member function)
파생 뷰가 비어 있지 않은지 반환합니다 ( ranges::empty 가 적용 가능한 경우에만 제공됨)
( std::ranges::view_interface<D> 의 public member function)
파생 뷰의 데이터 주소를 얻습니다 (반복자 타입이 contiguous_iterator 를 만족하는 경우에만 제공됨)
( std::ranges::view_interface<D> 의 public member function)
파생 뷰의 첫 번째 요소를 반환합니다 ( forward_range 를 만족하는 경우에만 제공됨)
( std::ranges::view_interface<D> 의 public member function)
파생 뷰의 마지막 요소를 반환합니다 ( bidirectional_range common_range 를 모두 만족하는 경우에만 제공됨)
( std::ranges::view_interface<D> 의 public member function)
파생 뷰의 n 번째 요소를 반환합니다 ( random_access_range 를 만족하는 경우에만 제공됨)
( std::ranges::view_interface<D> 의 public member function)

추론 가이드

비멤버 함수

std::ranges::subrange 에서 반복자나 센티널을 얻음
(함수 템플릿)

헬퍼 타입

std::ranges::subrange std::ranges::sized_range 를 모델링하는지 여부를 지정함
(열거형)
std::ranges::subrange 의 크기를 구함
(클래스 템플릿 특수화)
std::ranges::subrange 의 반복자 또는 센티널 타입을 구함
(클래스 템플릿 특수화)

헬퍼 템플릿

template < class I, class S, ranges:: subrange_kind K >
constexpr bool ranges:: enable_borrowed_range < ranges :: subrange < I, S, K >> = true ;
(C++20 이후)

이 특수화는 ranges:: enable_borrowed_range subrange borrowed_range 를 만족하도록 합니다.

예제

#include <map>
#include <print>
#include <ranges>
void make_uppercase(char& v)
{
    v += 'A' - 'a';
}
void uppercase_transform(std::multimap<int, char>& m, int k)
{
    auto [first, last] = m.equal_range(k);
    for (auto& [_, v] : std::ranges::subrange(first, last))
        make_uppercase(v);
}
int main()
{
    std::multimap<int, char> mm{{4, 'a'}, {3, '-'}, {4, 'b'}, {5, '-'}, {4, 'c'}};
    std::println("Before: {}", mm);
    uppercase_transform(mm, 4);
    std::println("After:  {}", mm);
}

출력:

Before: {3: '-', 4: 'a', 4: 'b', 4: 'c', 5: '-'}
After:  {3: '-', 4: 'A', 4: 'B', 4: 'C', 5: '-'}

결함 보고서

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

DR 적용 대상 게시된 동작 올바른 동작
LWG 3470 C++20 convertible-to-non-slicing 이 qualification 변환을 거부할 수 있음 항상 이를 허용함

참고 항목

view 를 정의하기 위한 도우미 클래스 템플릿, curiously recurring template pattern 을 사용함
(클래스 템플릿)

외부 링크

C++20에서 주어진 키로 std::multimap 의 모든 값 읽기/쓰기 — SO