std:: mdspan
| 
           Defined in header
            
            
             <mdspan>
            
            | ||
| 
           
            
             template
            
            
             <
            
             
             
              class
             
             T,
              | (since C++23) | |
       
        std::mdspan
       
       is a view into a contiguous sequence of objects that reinterprets it as a multidimensional array.
      
       Each specialization
       
        MDS
       
       of
       
        mdspan
       
       models
       
        
         copyable
        
       
       and satisfies:
      
- 
        - std:: is_nothrow_move_constructible_v < MDS > is true ,
- std:: is_nothrow_move_assignable_v < MDS > is true , and
- std:: is_nothrow_swappable_v < MDS > is true .
 
       A specialization of
       
        mdspan
       
       is a
       
        
         TriviallyCopyable
        
       
       type if its
       
        accessor_type
       
       ,
       
        mapping_type
       
       and
       
        data_handle_type
       
       are
       
        
         TriviallyCopyable
        
       
       types.
      
Template parameters
| T | - | element type; a complete object type that is neither an abstract class type nor an array type. | 
| Extents | - | specifies number of dimensions, their sizes, and which are known at compile time. Must be a specialization of std::extents . | 
| LayoutPolicy | - | specifies how to convert multidimensional index to underlying 1D index (column-major 3D array, symmetric triangular 2D matrix, etc). Must satisfy the requirements of LayoutMappingPolicy . | 
| AccessorPolicy | - | specifies how to convert underlying 1D index to a reference to T. Must satisfy the constraint that std:: is_same_v < T, typename AccessorPolicy :: element_type > is true . Must satisfy the requirements of AccessorPolicy . | 
Member types
| Member type | Definition | 
| 
          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 | 
Data members
| Name | Definition | 
| 
           accessor_type
          
          
           acc_
          
         (private) | the accessor ( exposition-only member object* ) | 
| 
           mapping_type
          
          
           map_
          
         (private) | the layout mapping ( exposition-only member object* ) | 
| 
           data_handle_type
          
          
           ptr_
          
         (private) | the underlying data handle ( exposition-only member object* ) | 
Member functions
| constructs an 
          mdspan
         (public member function) | |
| assigns an 
          mdspan
         (public member function) | |
| Element access | |
| accesses an element at the specified multidimensional index (public member function) | |
| Observers | |
| 
           
            
             
              [static]
             
            
           
           | returns the rank of a 
          mdspan
         (public static member function) | 
| 
           
            
             
              [static]
             
            
           
           | returns the dynamic rank of a 
          mdspan
         (public static member function) | 
| 
           
            
             
              [static]
             
            
           
           | returns the static extent size of a 
          mdspan
         at a given rank index(public static member function) | 
| returns the extent of a 
          mdspan
         at a given rank index(public member function) | |
| returns the size of the multidimensional index space (public member function) | |
| checks if the size of the index space is zero (public member function) | |
| obtains the stride along the specified dimension (public member function) | |
| obtains the extents object (public member function) | |
| obtains the pointer to the underlying 1D sequence (public member function) | |
| obtains the mapping object (public member function) | |
| obtains the accessor policy object (public member function) | |
| determines if this mdspan's mapping is unique (every combination of indices maps to a different underlying element) (public member function) | |
| determines if this mdspan's mapping is exhaustive (every underlying element can be accessed with some combination of indices) (public member function) | |
| determines if this mdspan's mapping is strided (in each dimension, incrementing an index jumps over the same number of underlying elements every time) (public member function) | |
| 
           
            
             
              [static]
             
            
           
           | determines if this mdspan's layout mapping is always unique (public static member function) | 
| 
           
            
             
              [static]
             
            
           
           | determines if this mdspan's layout mapping is always exhaustive (public static member function) | 
| 
           
            
             
              [static]
             
            
           
           | determines if this mdspan's layout mapping is always strided (public static member function) | 
Non-member functions
| 
           
            
             
              (C++23)
             
            
           
           | specializes the
         
          
           std::swap
          
         
         algorithm for mdspan (function template) | 
| Subviews | |
| 
           
            
             
              (C++26)
             
            
           
           | returns a view of a subset of an existing 
          mdspan
         (function template) | 
| 
           
            
             
              (C++26)
             
            
           
           | creates new extents from the existing extents and slice specifiers (function template) | 
Helper types and templates
| 
           
            
             
              (C++23)
             
            
           
           | a descriptor of a multidimensional index space of some rank (class template) | 
| 
           
            
             
              (C++23)
             
            
            
             
              (C++26)
             
            
           
           | convenience alias template for an all-dynamic
         
          std::extents (alias template) | 
| 
           
            
             
              (C++23)
             
            
           
           | a type for indexed access to elements of 
          mdspan
         (class template) | 
| 
           
            
             
              (C++26)
             
            
           
           | a type for aligned access to elements of 
          mdspan
         (class template) | 
| Layout mapping policies | |
| 
           
            
             
              (C++23)
             
            
           
           | column-major multidimensional array layout mapping policy; leftmost extent has stride 
          1
         (class) | 
| 
           
            
             
              (C++23)
             
            
           
           | row-major multidimensional array layout mapping policy; rightmost extent has stride 
          1
         (class) | 
| 
           
            
             
              (C++23)
             
            
           
           | a layout mapping policy with user-defined strides (class) | 
| 
           
            
             
              (C++26)
             
            
           
           | column-major layout mapping policy with padding stride that can be greater than or equal to the leftmost extent (class template) | 
| 
           
            
             
              (C++26)
             
            
           
           | row-major layout mapping policy with padding stride that can be greater than or equal to the rightmost extent (class template) | 
| Subviews helpers | |
| 
           
            
             
              (C++26)
             
            
           
           | a slice specifier tag describing full range of indices in the specified extent (tag) | 
| 
           
            
             
              (C++26)
             
            
           
           | a slice specifier representing a set of regularly spaced indices as indicated by an offset, an extent, and a stride (class template) | 
| 
           
            
             
              (C++26)
             
            
           
           | a return type of the overloads of 
          submdspan_mapping
         (class template) | 
Deduction guides
Notes
| Feature-test macro | Value | Std | Feature | 
|---|---|---|---|
| 
           __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 | 
Example
Can be previewed on 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}; // View data as contiguous memory representing 2 rows of 6 ints each auto ms2 = std::mdspan(v.data(), 2, 6); // View the same data as a 3D array 2 x 3 x 2 auto ms3 = std::mdspan(v.data(), 2, 3, 2); // Write data using 2D view 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; // Read back using 3D view 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(""); } } }
Output:
slice @ i = 0 0 1 2 3 4 5 slice @ i = 1 1000 1001 1002 1003 1004 1005
See also
| 
           
            
             
              (C++20)
             
            
           
           | a non-owning view over a contiguous sequence of objects (class template) | 
| numeric arrays, array masks and array slices (class template) |