std::ranges::views::stride, std::ranges::stride_view
| 헤더 <ranges>
|
||
template< ranges::input_range V >
requires ranges::view<V>
class stride_view
: public ranges::view_interface<stride_view<V>>
|
에 정의됨 (1) | (C++23부터) |
namespace views {
inline constexpr /* unspecified */ stride = /* unspecified */;
}
|
(2) | (C++23부터) |
| 호출 시그니처 |
||
template< ranges::viewable_range R >
constexpr ranges::view auto stride( R&& r, ranges::range_difference_t<R> n );
|
(C++23부터) | |
template< class DifferenceType >
constexpr /*range adaptor closure*/ stride( DifferenceType&& n );
|
(C++23부터) | |
| 헬퍼 템플릿 |
||
stride_view는 view와 숫자 n을 받아서, 매번 n개의 요소씩 건너뛰며 원본 뷰의 요소들로 구성된 뷰를 생성하는 범위 어댑터입니다. 즉, 생성된 뷰의 각 m번째 요소는 어떤 음이 아닌 인덱스 (n * i)에 대해 원본 뷰의 번째i 요소입니다.
"인덱스"가 n의 배수가 아닌 원본 뷰의 요소는 생성된 뷰에 존재하지 않습니다.S을 원본 뷰의 크기라고 하면, 생성된 뷰의 크기는 다음과 같습니다:
(S / n) + (S % n ? 1 : 0), 만약S >= n; 그렇지 않으면,1, 만약S > 0; 그렇지 않으면,0, 그리고 결과 뷰는 비어 있습니다.
views::stride은 RangeAdaptorObject를 나타냅니다. 부분 표현식 e과 n이 주어졌을 때, 표현식 views::stride(e, n)은 표현식-동등(expression-equivalent)하여 stride_view(e, n)입니다.n은 0보다 커야 합니다. 그렇지 않으면 동작이 정의되지 않습니다.stride_view는 항상 input_range를 모델링하며, 적응된 view 타입 이 해당 콘셉트를 모델링하는 경우 forward_range, bidirectional_range, random_access_range, 그리고/또는 sized_rangeV를 모델링합니다.
stride_view<V>는 기본 뷰 가 모델링할 때마다 common_rangeV를 모델링합니다.
데이터 멤버
| 멤버 | 설명 |
V
base_
|
기반 뷰
( 설명 전용 멤버 객체* ) |
ranges::
range_difference_t
<
V
>
stride_
|
크기 객체 ("stride")
( 설명 전용 멤버 객체* ) |
멤버 함수
stride_view
를 생성합니다
(public 멤버 함수) |
|
|
(C++23)
|
저장된 stride 값을 반환합니다
(public 멤버 함수) |
|
기본 (적응된) 뷰의 복사본을 반환합니다
(public 멤버 함수) |
|
|
시작을 가리키는 반복자를 반환합니다
(public 멤버 함수) |
|
|
끝을 가리키는 반복자나 센티널을 반환합니다
(public 멤버 함수) |
|
기본 (적응된) 범위가
sized_range
를 만족할 때만 제공되며, 요소의 개수를 반환합니다
(public 멤버 함수) |
|
|
(C++26)
|
결과
approximately_sized_range
의 근사 크기를 반환합니다
(public 멤버 함수) |
ranges::view_interface | |
|
|emptysized_range 또는 forward_range 를 만족하는 경우에만 파생 뷰가 비어 있는지 반환합니다 ( std::ranges::view_interface<D>의 공개 멤버 함수)
| |
(C++23) |
범위의 시작을 가리키는 상수 반복자를 반환합니다 ( std::ranges::view_interface<D>의 공개 멤버 함수)
|
(C++23) |
범위의 상수 반복자에 대한 센티널을 반환합니다 ( std::ranges::view_interface<D>의 공개 멤버 함수)
|
| 파생 뷰가 비어 있지 않은지 반환합니다. ranges::empty가 적용 가능한 경우에만 해당합니다 ( std::ranges::view_interface<D>의 공개 멤버 함수)
| |
| 파생 뷰의 첫 번째 요소를 반환합니다. forward_range 를 만족하는 경우에만 해당합니다 ( std::ranges::view_interface<D>의 공개 멤버 함수)
| |
| 파생 뷰의 마지막 요소를 반환합니다. bidirectional_range과 common_range 를 모두 만족하는 경우에만 해당합니다 ( std::ranges::view_interface<D>의 공개 멤버 함수)
| |
파생 뷰의 n번째 요소를 반환합니다. random_access_range 를 만족하는 경우에만 해당합니다 ( std::ranges::view_interface<D>의 공개 멤버 함수)
| |
추론 가이드
중첩 클래스
|
(C++23)
|
반복자 타입
( 설명 전용 멤버 클래스 템플릿* ) |
헬퍼 템플릿
|
template
<
class
V
>
constexpr
bool
ranges::
enable_borrowed_range
<
stride_view
<
V
>>
=
|
(C++23부터) | |
이
ranges::enable_borrowed_range
특수화는 기본 뷰가 이를 만족할 때
stride_view
가
borrowed_range
를 만족하도록 합니다.
참고 사항
| 기능 테스트 매크로 | 값 | 표준 | 기능 |
|---|---|---|---|
__cpp_lib_ranges_stride
|
202207L
|
(C++23) |
std::ranges::stride_view
|
예제
#include <algorithm> #include <iostream> #include <ranges> #include <string_view> using namespace std::literals; void print(std::ranges::viewable_range auto&& v, std::string_view separator = " ") { for (auto const& x : v) std::cout << x << separator; std::cout << '\n'; } int main() { print(std::views::iota(1, 13) | std::views::stride(3)); print(std::views::iota(1, 13) | std::views::stride(3) | std::views::reverse); print(std::views::iota(1, 13) | std::views::reverse | std::views::stride(3)); print("0x0!133713337*x//42/A$@"sv | std::views::stride(0B11) | std::views::transform([](char O) -> char { return 0100 | O; }), ""); }
출력:
1 4 7 10 10 7 4 1 12 9 6 3 password
참조문헌
- C++23 표준 (ISO/IEC 14882:2024):
-
- 26.7.31 스트라이드 뷰 [range.stride]
참고 항목
|
(C++23)
|
다른
view
의 M
th
부터 (M + N - 1)
th
까지의 요소에 대한
view
인 M
th
요소를 가진
view
(클래스 템플릿) (range adaptor object) |
|
(C++23)
|
다른
view
의 요소들에 대한
N
크기의 겹치지 않는 연속적인 청크들로 구성된
view
s
의 범위
(클래스 템플릿) (range adaptor object) |
적응된 뷰의 인접한 요소들에 대한 참조들의 튜플로 구성된
view
(클래스 템플릿) (range adaptor object) |
|
range
의 요소들 중 조건자를 만족하는 요소들로 구성된
view
(클래스 템플릿) (range adaptor object) |