Namespaces
Variants

std:: strided_slice

From cppreference.net
Definido en el encabezado <mdspan>
template < class OffsetType, class ExtentType, class StrideType >
struct strided_slice ;
(desde C++26)

Una instancia de cada especialización de strided_slice es un especificador de segmento utilizado en std::submdspan para seleccionar un subconjunto de elementos usando un conjunto de índices regularmente espaciados en una dimensión especificada en std::mdspan .

Cada strided_slice objeto s se caracteriza por tres miembros de datos: el índice de desplazamiento s. offset , la extensión s. extent , y el paso s. stride .

Dado que s. stride es mayor que cero, el número de índices seleccionados denotado por N se determina mediante 1 + ( s. extent - 1 ) / s. stride si s. extent es distinto de cero, de lo contrario 0 . El intervalo semiabierto del cual se seleccionarán los índices está dado por [ s. offset , s. offset + s. extent ) . La secuencia de índices seleccionados se produce de la siguiente manera: s. offset , ..., s. offset + ( N - 1 ) * s. stride .

Esta plantilla de clase no tiene clases base ni miembros declarados aparte de los que se muestran a continuación.

Contenidos

Parámetros de plantilla

OffsetType - el tipo de desplazamiento
ExtentType - el tipo de extensión
StrideType - el tipo de paso
Requisitos de tipo
-
Todos los parámetros de plantilla deben ser tipos enteros con signo o sin signo, o deben satisfacer integral-constant-like

El programa está mal formado si no se satisface el requisito de tipo.

Tipos de miembros

Tipo de miembro Definición
offset_type OffsetType
extent_type ExtentType
stride_type StrideType

Miembros de datos

Nombre del miembro Definición
offset
un índice inicial de tipo offset_type
(objeto miembro público)
extent
un valor de tipo extent_type añadido al offset usado para definir el límite superior de índices
(objeto miembro público)
stride
un valor de incremento de tipo stride_type que equivale a la distancia entre dos índices
(objeto miembro público)

Todos estos miembros se declaran con el atributo [[ no_unique_address ]] y tienen inicializadores de miembros predeterminados donde cada miembro de datos se inicializa por valor.

Notas

Cada especialización de strided_slice es una clase agregada que permite inicialización agregada (incluyendo inicialización designada) de miembros de datos (por ejemplo, std :: strided_slice { . offset = 2 , . extent = 10 , . stride = 3 } ).

La especificación de segmento de strided_slice aprovecha el miembro de datos extent , a diferencia de otras especificaciones de segmento que utilizan end para indicar el valor del límite superior. Esto se debe a que puede generar directamente una extensión estática para la subvista de std::mdspan si tanto extent como stride son de tipos que satisfacen integral-constant-like . Esto permite la extracción eficiente de subvistas con extensiones estáticas mediante la combinación de valores en tiempo de compilación con un valor en tiempo de ejecución de offset .

Ejemplo

#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("] extraído de los índices [");
    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});
}

Salida:

[A, B, C, D, E, F, G, H, I, J] extraído de los índices [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[C, D, E, F, G, H, I, J, K, L] extraído de los índices [2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
[A, B, C, D, E] extraído de los índices [0, 1, 2, 3, 4]
[C, D, E, F, G] extraído de los índices [2, 3, 4, 5, 6]
[A, C, E, G, I] extraído de los índices [0, 2, 4, 6, 8]
[C, F, I, L] extraído de los índices [2, 5, 8, 11]
[A, F, K] extraído de los índices [0, 5, 10]
[G, L, Q] extraído de los índices [6, 11, 16]

Véase también

Segmento tipo BLAS de un valarray: índice inicial, longitud, paso
(clase)
(C++26)
devuelve una vista de un subconjunto de un mdspan existente
(plantilla de función)