std:: strided_slice
|
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 | ||
|
-
|
||
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) |