Namespaces
Variants

std:: mdspan

From cppreference.net
Definido en el 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 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:

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)
devuelve el rango dinámico de un mdspan
(función miembro estática pública)
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)
determina si el mapeo de diseño de este mdspan es siempre único
(función miembro estática pública)
determina si el mapeo de diseño de este mdspan es siempre exhaustivo
(función miembro estática pública)
determina si el mapeo de diseño de este mdspan es siempre con stride
(función miembro estática pública)

Funciones no miembro

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)
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)
un tipo para acceso indexado a elementos de mdspan
(plantilla de clase)
un tipo para acceso alineado a elementos de mdspan
(plantilla de clase)
Políticas de mapeo de diseño
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)
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)
una política de mapeo de diseño con strides definidos por el usuario
(clase)
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)
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
una etiqueta especificadora de segmento que describe el rango completo de índices en la extensión especificada.
(etiqueta)
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)
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)