std::ranges:: subrange
|
헤더 파일에 정의됨
<ranges>
|
||
|
template
<
std::
input_or_output_iterator
I,
|
(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) | ( 설명 전용* ) |
subrange
클래스 템플릿은 반복자와 센티널을 단일
view
로 결합합니다. 이는 최종 템플릿 매개변수가
subrange_kind
::
sized
일 때마다
sized_range
를 모델링합니다 (이는
std::
sized_sentinel_for
<
S, I
>
가 만족되거나 크기가 생성자 인수로 명시적으로 전달될 때 발생합니다).
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>(*)[]>;
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)
|
|
추론 가이드
비멤버 함수
|
(C++20)
|
std::ranges::subrange
에서 반복자나 센티널을 얻음
(함수 템플릿) |
헬퍼 타입
|
(C++20)
|
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 변환을 거부할 수 있음
|
항상 이를 허용함 |
참고 항목
|
(C++20)
|
view
를 정의하기 위한 도우미 클래스 템플릿,
curiously recurring template pattern
을 사용함
(클래스 템플릿) |
외부 링크
C++20에서 주어진 키로
std::multimap
의 모든 값 읽기/쓰기
— SO
|