std:: strided_slice
|
헤더 파일에 정의됨
<mdspan>
|
||
|
template
<
class
OffsetType,
class
ExtentType,
class
StrideType
>
struct strided_slice ; |
(C++26부터) | |
strided_slice
의 모든 특수화(specialization) 인스턴스는
std::mdspan
내 지정된 차원에서 규칙적인 간격을 가진 인덱스 집합을 사용하여 요소의 부분 집합을 선택하기 위해
std::submdspan
에서 사용되는 슬라이스 지정자입니다.
각
strided_slice
객체
s
는 세 가지 데이터 멤버로 특징지어집니다: 오프셋 인덱스
s.
offset
, 범위
s.
extent
, 그리고 스트라이드
s.
stride
.
s.
stride
가 0보다 클 때, 선택된 인덱스의 개수를 나타내는
N
은
s.
extent
이 0이 아닌 경우
1
+
(
s.
extent
-
1
)
/
s.
stride
에 의해 결정되며, 그렇지 않은 경우
0
입니다. 인덱스가 선택되는 반개방 구간은
[
s.
offset
,
s.
offset
+
s.
extent
)
로 주어집니다. 선택된 인덱스의 시퀀스는 다음과 같이 생성됩니다:
s.
offset
, ..., s.
offset
+
(
N
-
1
)
*
s.
stride
.
이 클래스 템플릿은 아래에 표시된 것 외에는 기본 클래스나 선언된 멤버가 없습니다.
목차 |
템플릿 매개변수
| OffsetType | - | 오프셋의 타입 |
| ExtentType | - | 익스텐트의 타입 |
| StrideType | - | 스트라이드의 타입 |
| 타입 요구사항 | ||
|
-
|
||
타입 요구사항이 충족되지 않으면 프로그램의 형식이 잘못되었습니다.
멤버 타입
| 멤버 타입 | 정의 |
offset_type
|
OffsetType
|
extent_type
|
ExtentType
|
stride_type
|
StrideType
|
데이터 멤버
| 멤버 이름 | 정의 |
|
offset
|
offset_type
타입의 시작 인덱스
(public member object) |
|
extent
|
extent_type
타입의 값으로, 인덱스의 상한을 정의하기 위해 offset에 더해짐
(public member object) |
|
stride
|
stride_type
타입의 증분 값으로, 두 인덱스 사이의 거리와 동일함
(public member object) |
이 모든 멤버들은
[[
no_unique_address
]]
속성으로 선언되었으며, 각 데이터 멤버가 값 초기화되는 기본 멤버 초기화자를 가지고 있습니다.
참고 사항
strided_slice
의 모든 특수화는
집합체 초기화
(지정자 초기화 포함)를 허용하는 집합체 클래스입니다 (예를 들어,
std
::
strided_slice
{
.
offset
=
2
, .
extent
=
10
, .
stride
=
3
}
).
strided_slice
의 슬라이스 명세는 다른 슬라이스 명세들이 상한 경계값을 나타내기 위해
end
를 사용하는 것과 달리, 데이터 멤버
extent
의 장점을 활용합니다. 이는
extent
와
stride
가 모두
integral-constant-like
를 만족하는 타입일 경우,
std::mdspan
의 서브뷰에 대한 정적 익스텐트를 직접 생성할 수 있기 때문입니다. 이는 컴파일 타임 값과
offset
의 런타임 값을 혼합하여 정적 익스텐트를 가진 서브뷰를 효율적으로 추출할 수 있게 합니다.
예제
#include <mdspan> #include <print> template <typename View, typename O = int, typename E = int, typename S = int> requires (View::extents_type::rank() == 1) void print_sliced_view(View v, std::strided_slice<O, E, S> s) { using index_type = View::index_type; auto subview = std::submdspan(v, s); const auto& submap = subview.mapping(); std::print("["); bool uses_comma = false; for (index_type i = 0; i != subview.extent(0); ++i) { if (uses_comma) std::print(", "); std::print("{}", subview[i]); uses_comma = true; } uses_comma = false; std::print("] extracted from indices ["); for (index_type i = 0; i != subview.extent(0); ++i) { if (uses_comma) std::print(", "); std::print("{}", submap(i) + s.offset); uses_comma = true; } std::println("]"); } int main() { static constexpr char letters[] { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z' }; constexpr std::mdspan md(letters, 26); print_sliced_view(md, {.offset = 0, .extent = 10, .stride = 1}); print_sliced_view(md, {.offset = 2, .extent = 10, .stride = 1}); print_sliced_view(md, {.offset = 0, .extent = 5, .stride = 1}); print_sliced_view(md, {.offset = 2, .extent = 5, .stride = 1}); print_sliced_view(md, {.offset = 0, .extent = 10, .stride = 2}); print_sliced_view(md, {.offset = 2, .extent = 10, .stride = 3}); print_sliced_view(md, {.offset = 0, .extent = 15, .stride = 5}); print_sliced_view(md, {.offset = 6, .extent = 15, .stride = 5}); }
출력:
[A, B, C, D, E, F, G, H, I, J] extracted from indices [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] [C, D, E, F, G, H, I, J, K, L] extracted from indices [2, 3, 4, 5, 6, 7, 8, 9, 10, 11] [A, B, C, D, E] extracted from indices [0, 1, 2, 3, 4] [C, D, E, F, G] extracted from indices [2, 3, 4, 5, 6] [A, C, E, G, I] extracted from indices [0, 2, 4, 6, 8] [C, F, I, L] extracted from indices [2, 5, 8, 11] [A, F, K] extracted from indices [0, 5, 10] [G, L, Q] extracted from indices [6, 11, 16]
참고 항목
|
BLAS와 유사한 valarray 슬라이스: 시작 인덱스, 길이, 스트라이드
(클래스) |
|
|
(C++26)
|
기존
mdspan
의 부분 집합에 대한 뷰를 반환함
(함수 템플릿) |