Namespaces
Variants

std:: strided_slice

From cppreference.net
헤더 파일에 정의됨 <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 - 스트라이드의 타입
타입 요구사항
-
모든 템플릿 매개변수는 부호 있는 또는 부호 없는 정수 타입이거나 integral-constant-like 를 만족해야 함

타입 요구사항이 충족되지 않으면 프로그램의 형식이 잘못되었습니다.

멤버 타입

멤버 타입 정의
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 의 부분 집합에 대한 뷰를 반환함
(함수 템플릿)