std:: mdspan
|
Definido en el encabezado
<mdspan>
|
||
|
template
<
class
T,
|
(desde C++23) | |
std::mdspan
es una vista de arreglo multidimensional que mapea un índice multidimensional a un elemento del arreglo. La política de mapeo y acceso a elementos es configurable, y el arreglo subyacente no necesita ser contiguo ni siquiera existir en memoria.
Cada especialización
MDS
de
mdspan
modela
copyable
y satisface:
-
- std:: is_nothrow_move_constructible_v < MDS > es true ,
- std:: is_nothrow_move_assignable_v < MDS > es true , y
- std:: is_nothrow_swappable_v < MDS > es true .
Una especialización de
mdspan
es un tipo
TriviallyCopyable
si su
accessor_type
,
mapping_type
y
data_handle_type
son tipos
TriviallyCopyable
.
Contenidos |
Parámetros de plantilla
| T | - | tipo de elemento; un tipo de objeto completo que no es ni un tipo de clase abstracta ni un tipo de arreglo. |
| Extents | - | especifica el número de dimensiones, sus tamaños y cuáles se conocen en tiempo de compilación. Debe ser una especialización de std::extents . |
| LayoutPolicy | - | especifica cómo convertir un índice multidimensional en un índice unidimensional subyacente (arreglo 3D en orden de columnas, matriz triangular simétrica 2D, etc.). Debe satisfacer los requisitos de LayoutMappingPolicy . |
| AccessorPolicy | - | especifica cómo convertir un índice unidimensional subyacente en una referencia a T. Debe satisfacer la restricción de que std:: is_same_v < T, typename AccessorPolicy :: element_type > sea true . Debe satisfacer los requisitos de AccessorPolicy . |
Tipos de miembros
| Miembro | Definición |
extents_type
|
Extents
|
layout_type
|
LayoutPolicy
|
accessor_type
|
AccessorPolicy
|
mapping_type
|
LayoutPolicy :: mapping < Extents > |
element_type
|
T
|
value_type
|
std:: remove_cv_t < T > |
index_type
|
Extents :: index_type |
size_type
|
Extents :: size_type |
rank_type
|
Extents :: rank_type |
data_handle_type
|
AccessorPolicy :: data_handle_type |
reference
|
AccessorPolicy :: reference |
Miembros de datos
| Miembro | Descripción |
accessor_type
acc_
(privado)
|
el accessor
( objeto miembro solo-exposición* ) |
mapping_type
map_
(privado)
|
el layout mapping
( objeto miembro solo-exposición* ) |
data_handle_type
ptr_
(privado)
|
el data handle subyacente
( objeto miembro solo-exposición* ) |
Funciones miembro
construye un
mdspan
(función miembro pública) |
|
asigna un
mdspan
(función miembro pública) |
|
Acceso a elementos |
|
|
accede a un elemento en el índice multidimensional especificado
(función miembro pública) |
|
Observadores |
|
|
[static]
|
devuelve el rango de un
mdspan
(función miembro estática pública) |
|
[static]
|
devuelve el rango dinámico de un
mdspan
(función miembro estática pública) |
|
[static]
|
devuelve el tamaño de extensión estática de un
mdspan
en un índice de rango dado
(función miembro estática pública) |
devuelve la extensión de un
mdspan
en un índice de rango dado
(función miembro pública) |
|
|
devuelve el tamaño del espacio de índices multidimensional
(función miembro pública) |
|
|
comprueba si el tamaño del espacio de índices es cero
(función miembro pública) |
|
|
obtiene el stride a lo largo de la dimensión especificada
(función miembro pública) |
|
|
obtiene el objeto de extensiones
(función miembro pública) |
|
|
obtiene el puntero a la secuencia 1D subyacente
(función miembro pública) |
|
|
obtiene el objeto de mapeo
(función miembro pública) |
|
|
obtiene el objeto de política de acceso
(función miembro pública) |
|
|
determina si el mapeo de este mdspan es único (cada combinación de índices mapea a un elemento subyacente diferente)
(función miembro pública) |
|
|
determina si el mapeo de este mdspan es exhaustivo (cada elemento subyacente puede ser accedido con alguna combinación de índices)
(función miembro pública) |
|
|
determina si el mapeo de este mdspan es con stride (en cada dimensión, incrementar un índice salta sobre el mismo número de elementos subyacentes cada vez)
(función miembro pública) |
|
|
[static]
|
determina si el mapeo de diseño de este mdspan es siempre único
(función miembro estática pública) |
|
[static]
|
determina si el mapeo de diseño de este mdspan es siempre exhaustivo
(función miembro estática pública) |
|
[static]
|
determina si el mapeo de diseño de este mdspan es siempre con stride
(función miembro estática pública) |
Funciones no miembro
|
(C++23)
|
especializa el algoritmo
std::swap
para mdspan
(plantilla de función) |
Subvistas |
|
|
(C++26)
|
devuelve una vista de un subconjunto de un
mdspan
existente
(plantilla de función) |
|
(C++26)
|
crea nuevas extensiones a partir de las extensiones existentes y los especificadores de segmento
(plantilla de función) |
Tipos y plantillas auxiliares
|
(C++23)
|
un descriptor de un espacio de índices multidimensional de algún rango
(plantilla de clase) |
|
(C++23)
(C++26)
|
alias de plantilla conveniente para un
std::extents
completamente dinámico
(plantilla de alias) |
|
(C++23)
|
un tipo para acceso indexado a elementos de
mdspan
(plantilla de clase) |
|
(C++26)
|
un tipo para acceso alineado a elementos de
mdspan
(plantilla de clase) |
Políticas de mapeo de diseño |
|
|
(C++23)
|
política de mapeo de diseño de arreglo multidimensional en orden de columnas; la extensión más a la izquierda tiene stride
1
(clase) |
|
(C++23)
|
política de mapeo de diseño de arreglo multidimensional en orden de filas; la extensión más a la derecha tiene stride
1
(clase) |
|
(C++23)
|
una política de mapeo de diseño con strides definidos por el usuario
(clase) |
|
(C++26)
|
política de mapeo de diseño en orden de columnas con stride de relleno que puede ser mayor o igual que la extensión más a la izquierda
(plantilla de clase) |
|
(C++26)
|
política de mapeo de diseño en orden de filas con stride de relleno que puede ser mayor o igual que la extensión más a la derecha
(plantilla de clase) |
Ayudas para subvistas |
|
|
(C++26)
|
una etiqueta especificadora de segmento que describe el rango completo de índices en la extensión especificada.
(etiqueta) |
|
(C++26)
|
un especificador de segmento que representa un conjunto de índices espaciados regularmente como se indica por un desplazamiento, una extensión y un stride
(plantilla de clase) |
|
(C++26)
|
un tipo de retorno de las sobrecargas de
submdspan_mapping
(plantilla de clase) |
Guías de deducción
Notas
| Macro de prueba de características | Valor | Estándar | Característica |
|---|---|---|---|
__cpp_lib_mdspan
|
202207L
|
(C++23) |
std::mdspan
|
__cpp_lib_submdspan
|
202306L
|
(C++26) | std::submdspan |
202403L
|
(C++26) |
std::mdspan
diseños con relleno
|
|
__cpp_lib_aligned_accessor
|
202411L
|
(C++26) | std::aligned_accessor |
Ejemplo
Se puede previsualizar en Compiler Explorer .
#include <cstddef> #include <mdspan> #include <print> #include <vector> int main() { std::vector v{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12}; // Ver los datos como memoria contigua representando 2 filas de 6 enteros cada una auto ms2 = std::mdspan(v.data(), 2, 6); // Ver los mismos datos como un arreglo 3D 2 x 3 x 2 auto ms3 = std::mdspan(v.data(), 2, 3, 2); // Escribir datos usando la vista 2D for (std::size_t i = 0; i != ms2.extent(0); i++) for (std::size_t j = 0; j != ms2.extent(1); j++) ms2[i, j] = i * 1000 + j; // Leer usando la vista 3D for (std::size_t i = 0; i != ms3.extent(0); i++) { std::println("slice @ i = {}", i); for (std::size_t j = 0; j != ms3.extent(1); j++) { for (std::size_t k = 0; k != ms3.extent(2); k++) std::print("{} ", ms3[i, j, k]); std::println(""); } } }
Salida:
slice @ i = 0 0 1 2 3 4 5 slice @ i = 1 1000 1001 1002 1003 1004 1005
Véase también
|
(C++20)
|
una vista no propietaria sobre una secuencia contigua de objetos
(plantilla de clase) |
|
arreglos numéricos, máscaras de arreglo y segmentos de arreglo
(plantilla de clase) |