Espacios de nombres
Variantes
Acciones

std::strided_slice

De cppreference.com
< cpp‎ | container‎ | mdspan
 
 
 
 
Definido en el archivo de 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 tipo especificador de sección usado en std::submdspan para seleccionar un subconjunto de elementos usando un conjunto de índices regularmente espaciados en una dimensión especificada en std::mdspan. Proporciona tres valores: el índice de desplazamiento, la dimensión y el avance.

Dado que stride es mayor que cero, sea N el número de índices seleccionados que está determinado por 1 + (extent - 1) / stride si extent es distinto de cero; de lo contrario, 0. Los índices se seleccionan del intervalo medio abierto [offset, offset + extent). Por lo tanto, los índices seleccionados son offset, ..., offset + (N - 1) * stride.

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

Contenido

[editar] Parámetros de plantilla

OffsetType
ExtentType
StrideType
- Los tipos del desplazamiento, la dimensión y el avance, respectivamente.
Requisitos de tipo
-
Todos los parámetros de la plantilla deben ser tipos enteros sin signo o con signo o deben satisfacer integral-constant-like

El programa está mal formado si no se cumple el requerimiento de tipo.

[editar] Tipos miembro

Tipo miembro Definición
offset_type OffsetType
extent_type ExtentType
stride_type StrideType

[editar] Datos miembro

Nombre de 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 desplazamiento utilizado para definir el límite superior de los índices.
(objeto miembro público)
stride
Un valor incremental de tipo stride_type que es equivalente 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 miembro por defecto donde cada dato miembro se inicializa por valor.

[editar] Notas

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

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

[editar] 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("] 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});
}

Salida:

[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]

[editar] Véase también

BLAS-como una rebanada de valarray: índice de inicio, duración, ritmo
Original:
BLAS-like slice of a valarray: starting index, length, stride
The text has been machine-translated via Google Translate.
You can help to correct and verify the translation. Click here for instructions.

(clase) [editar]
(C++26)
Devuelve una vista de un subconjunto de un mdspan existente.
(plantilla de función) [editar]