std::mdspan
De cppreference.com
Definido en el archivo de encabezado <mdspan>
|
||
template< class T, |
(desde C++23) | |
std::mdspan
es una vista de una secuencia contigua de objetos que la reinterpreta como un array multidimensional.
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 TrivialmenteCopiable si su accessor_type
, mapping_type
y data_handle_type
son tipos TrivialmenteCopiable.
Contenido |
[editar] Parámetros de plantilla
T | - | Tipo de elemento; un tipo objeto completo que no es ni un tipo clase abstracta ni un tipo array. |
Extents | - | Especifica el número de dimensiones, sus tamaños y cuáles se conocen en el momento de la compilación. Debe ser una especialización de std::extents. |
LayoutPolicy | - | Especifica cómo convertir un índice multidimensional a un índice 1D subyacente (array 3D de columna principal, array 2D triangular simétrica, etc.)). |
AccessorPolicy | - | Especifica cómo convertir el índice 1D subyacente en una referencia a T. Debe satisfacer la restricción de que std::is_same_v<T, typename AccessorPolicy::element_type> es true. |
[editar] Tipos miembro
Tipo 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 |
[editar] Datos miembro
Nombre | Definición |
acc_ (private)
|
El descriptor de acceso. (objeto miembro solo de exposición*) |
map_ (private)
|
El mapeo de diseño. (objeto miembro solo de exposición*) |
ptr_ (private)
|
El identificador de datos subyacente. (objeto miembro solo de exposición*) |
[editar] Funciones miembro
Construye un objeto de tipo mdspan . (función miembro pública) | |
Asigna un objeto de tipo mdspan . (función miembro pública) | |
Acceso a elementos | |
Accede a un elemento en el índice multidimensional especificado. (función miembro pública) | |
Observadores | |
[estático] |
Devuelve el rango de un mdspan . (función miembro estática pública) |
[estático] |
Devuelve el rango dinámico de un mdspan . (función miembro estática pública) |
[estático] |
Devuelve el tamaño de extensión estático 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 del índice multidimensional. (función miembro pública) | |
Comprueba si el tamaño del espacio de índice es cero. (función miembro pública) | |
Obtiene el avance a lo largo de la dimensión especificada. (función miembro pública) | |
Obtiene el objeto de tipo std::extents. (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 del accessor. (función miembro pública) | |
Determina si el mapeo de este mdspan es único (cada combinación de índices se asigna a un elemento subyacente diferente). (función miembro pública) | |
Determina si el mapeo de este mdspan es exhaustivo (se puede acceder a cada elemento subyacente con alguna combinación de índices). (función miembro pública) | |
Determina si se avanza el mapeo de este mdspan (en cada dimensión, al incrementar un índice se salta el mismo número de elementos subyacentes cada vez). (función miembro pública) | |
[estático] |
Determina si el mapeo de diseño de este mdspan es siempre único. (función miembro estática pública) |
[estático] |
Determina si el mapeo de diseño de este mdspan es siempre exhaustivo. (función miembro estática pública) |
[estático] |
Determina si el mapeo de diseño de este mdspan siempre se avanza. (función miembro estática pública) |
[editar] 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 sección. (plantilla de función) |
[editar] Tipos auxiliares y plantillas
(C++23) |
Un descriptor de un espacio de índice multidimensional de algún rango. (plantilla de clase) |
(C++23) |
Plantilla de alias conveniente para un std::extents totalmente dinámico. (plantilla de alias) |
(C++23) |
Un tipo para acceso indexado a elementos de mdspan . (plantilla de clase) |
(C++26) |
Un tipo para el acceso alineado a los elementos de mdspan . (plantilla de clase) |
Políticas de mapeo de diseño | |
(C++23) |
Política de mapeo de diseño de array multidimensional de columnas principales; la extensión más a la izquierda tiene avance 1 . (clase) |
(C++23) |
Política de mapeo de diseño de array multidimensional de fila principal; la extensión más a la derecha tiene avance 1 . (clase) |
(C++23) |
Una política de mapeo de diseño con avances definidos por el usuario. (clase) |
(C++26) |
Política de mapeo de diseño de columna principal con paso 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 de fila principal con paso de relleno que puede ser mayor o igual que la extensión más a la derecha. (plantilla de clase) |
Auxiliares de subvistas | |
(C++26) |
Una etiqueta especificadora de sectores que describe el rango completo de índices en la extensión especificada. (tag) |
(C++26) |
Un especificador de sección que representa un conjunto de índices espaciados regularmente como lo indica un desplazamiento, una extensión y un avance. (plantilla de clase) |
(C++26) |
Un tipo de retorno de las sobrecargas de submdspan_mapping . (plantilla de clase) |
[editar] Guías de deducción
[editar] Notas
Macro de prueba de característica | |||
---|---|---|---|
__cpp_lib_mdspan |
202207L | (C++23) | std::mdspan
|
__cpp_lib_submdspan |
202306L | (C++26) | std::submdspan |
202403L | (C++26) | std::mdspan padded layouts
| |
__cpp_lib_aligned_accessor |
202411L | (C++26) | std::aligned_accessor |
[editar] Ejemplo
Se puede obtener una vista previa en Compiler Explorer.
Ejecuta este código
#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 datos como memoria contigua que representa 2 filas de 6 entradas cada una auto ms2 = std::mdspan(v.data(), 2, 6); // Ver los mismos datos como un array 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; // Volver a leer usando la vista 3D for (std::size_t i = 0; i != ms3.extent(0); i++) { std::println("sección @ 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:
sección @ i = 0 0 1 2 3 4 5 sección @ i = 1 1000 1001 1002 1003 1004 1005
[editar] Véase también
(C++20) |
Una vista que no es dueña sobre una secuencia contigua de objetos. (plantilla de clase) |
arrays numéricos, máscaras de arrays y secciones de array. (plantilla de clase) |