Espacios de nombres
Variantes
Acciones

std::mdspan

De cppreference.com
< cpp‎ | container
 
 
 
 
Definido en el archivo de encabezado <mdspan>
template<

    class T,
    class Extents,
    class LayoutPolicy = std::layout_right,
    class AccessorPolicy = std::default_accessor<T>

> class mdspan;
(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:

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) [editar]
Asigna un objeto de tipo mdspan.
(función miembro pública) [editar]
Acceso a elementos
Accede a un elemento en el índice multidimensional especificado.
(función miembro pública) [editar]
Observadores
[estático]
Devuelve el rango de un mdspan.
(función miembro estática pública) [editar]
[estático]
Devuelve el rango dinámico de un mdspan.
(función miembro estática pública) [editar]
[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) [editar]
Devuelve la extensión de un mdspan en un índice de rango dado.
(función miembro pública) [editar]
Devuelve el tamaño del espacio del índice multidimensional.
(función miembro pública) [editar]
Comprueba si el tamaño del espacio de índice es cero.
(función miembro pública) [editar]
Obtiene el avance a lo largo de la dimensión especificada.
(función miembro pública) [editar]
Obtiene el objeto de tipo std::extents.
(función miembro pública) [editar]
Obtiene el puntero a la secuencia 1D subyacente.
(función miembro pública) [editar]
Obtiene el objeto de mapeo.
(función miembro pública) [editar]
Obtiene el objeto de política del accessor.
(función miembro pública) [editar]
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) [editar]
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) [editar]
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) [editar]
Determina si el mapeo de diseño de este mdspan es siempre único.
(función miembro estática pública) [editar]
Determina si el mapeo de diseño de este mdspan es siempre exhaustivo.
(función miembro estática pública) [editar]
Determina si el mapeo de diseño de este mdspan siempre se avanza.
(función miembro estática pública) [editar]

[editar] Funciones no miembro

Especializa el algoritmo std::swap para mdspan.
(plantilla de función) [editar]
Subvistas
(C++26)
Devuelve una vista de un subconjunto de un mdspan existente.
(plantilla de función) [editar]
Crea nuevas extensiones a partir de las extensiones existentes y los especificadores de sección.
(plantilla de función) [editar]

[editar] Tipos auxiliares y plantillas

(C++23)
Un descriptor de un espacio de índice multidimensional de algún rango.
(plantilla de clase) [editar]
(C++23)
Plantilla de alias conveniente para un std::extents totalmente dinámico.
(plantilla de alias) [editar]
Un tipo para acceso indexado a elementos de mdspan.
(plantilla de clase) [editar]
Un tipo para el acceso alineado a los elementos de mdspan.
(plantilla de clase) [editar]
Políticas de mapeo de diseño
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) [editar]
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) [editar]
Una política de mapeo de diseño con avances definidos por el usuario.
(clase) [editar]
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) [editar]
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) [editar]
Auxiliares de subvistas
Una etiqueta especificadora de sectores que describe el rango completo de índices en la extensión especificada.
(tag)[editar]
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) [editar]
Un tipo de retorno de las sobrecargas de submdspan_mapping.
(plantilla de clase) [editar]

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

#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) [editar]
arrays numéricos, máscaras de arrays y secciones de array.
(plantilla de clase) [editar]