Namespaces
Variants

std:: mdspan

From cppreference.net
헤더에 정의됨 <mdspan>
template <

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

> class mdspan ;
(C++23부터)

std::mdspan 는 다차원 인덱스를 배열의 요소에 매핑하는 다차원 배열 뷰입니다. 매핑 및 요소 접근 정책은 구성 가능하며, 기본 배열이 연속적일 필요는 없으며 메모리에 전혀 존재하지 않을 수도 있습니다.

각 전문화 MDS mdspan copyable 개념을 모델링하며 다음을 만족합니다:

mdspan 의 특수화는 TriviallyCopyable 타입입니다, 만약 그 accessor_type , mapping_type 그리고 data_handle_type TriviallyCopyable 타입들일 경우.

목차

템플릿 매개변수

T - 요소 타입; 추상 클래스 타입이나 배열 타입이 아닌 완전한 객체 타입입니다.
Extents - 차원 수, 크기, 컴파일 타임에 알려진 차원을 지정합니다. std::extents 의 특수화여야 합니다.
LayoutPolicy - 다차원 인덱스를 기본 1D 인덱스로 변환하는 방법을 지정합니다(열 우선 3D 배열, 대칭 삼각 2D 행렬 등). LayoutMappingPolicy 요구 사항을 충족해야 합니다.
AccessorPolicy - 기본 1D 인덱스를 T에 대한 참조로 변환하는 방법을 지정합니다. std:: is_same_v < T, typename AccessorPolicy​ :: ​element_type > true 여야 합니다. AccessorPolicy 요구 사항을 충족해야 합니다.

멤버 타입

멤버 정의
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

데이터 멤버

멤버 설명
accessor_type acc_ (private) 액세서
( 설명 전용 멤버 객체* )
mapping_type map_ (private) 레이아웃 매핑
( 설명 전용 멤버 객체* )
data_handle_type ptr_ (private) 기반 데이터 핸들
( 설명 전용 멤버 객체* )

멤버 함수

mdspan 을 생성합니다
(public member function)
mdspan 을 할당합니다
(public member function)
원소 접근
지정된 다차원 인덱스의 원소에 접근합니다
(public member function)
관찰자
[static]
mdspan 의 차원 수를 반환합니다
(public static member function)
mdspan 의 동적 차원 수를 반환합니다
(public static member function)
주어진 차원 인덱스에서 mdspan 의 정적 extent 크기를 반환합니다
(public static member function)
주어진 차원 인덱스에서 mdspan 의 extent를 반환합니다
(public member function)
다차원 인덱스 공간의 크기를 반환합니다
(public member function)
인덱스 공간의 크기가 0인지 확인합니다
(public member function)
지정된 차원을 따른 stride를 얻습니다
(public member function)
extents 객체를 얻습니다
(public member function)
기반 1차원 시퀀스에 대한 포인터를 얻습니다
(public member function)
매핑 객체를 얻습니다
(public member function)
접근자 정책 객체를 얻습니다
(public member function)
이 mdspan의 매핑이 고유한지 확인합니다 (모든 인덱스 조합이 서로 다른 기반 원소에 매핑됨)
(public member function)
이 mdspan의 매핑이 완전한지 확인합니다 (모든 기반 원소가 어떤 인덱스 조합으로 접근 가능함)
(public member function)
이 mdspan의 매핑이 strided인지 확인합니다 (각 차원에서 인덱스를 증가시킬 때마다 항상 동일한 수의 기반 원소를 건너뜀)
(public member function)
이 mdspan의 레이아웃 매핑이 항상 고유한지 확인합니다
(public static member function)
이 mdspan의 레이아웃 매핑이 항상 완전한지 확인합니다
(public static member function)
이 mdspan의 레이아웃 매핑이 항상 strided인지 확인합니다
(public static member function)

비멤버 함수

mdspan에 대한 std::swap 알고리즘 특수화
(함수 템플릿)
서브뷰
(C++26)
기존 mdspan 의 부분 집합에 대한 뷰를 반환함
(함수 템플릿)
기존 extents와 슬라이스 지정자로부터 새로운 extents를 생성함
(함수 템플릿)

헬퍼 타입 및 템플릿

(C++23)
특정 랭크의 다차원 인덱스 공간에 대한 기술자
(클래스 템플릿)
(C++23) (C++26)
모든 동적 차원을 갖는 std::extents 에 대한 편의 별칭 템플릿
(별칭 템플릿)
mdspan 요소에 대한 인덱스 기반 접근을 위한 타입
(클래스 템플릿)
mdspan 요소에 대한 정렬된 접근을 위한 타입
(클래스 템플릿)
레이아웃 매핑 정책
열 우선 다차원 배열 레이아웃 매핑 정책; 가장 왼쪽 차원의 스트라이드가 1
(클래스)
행 우선 다차원 배열 레이아웃 매핑 정책; 가장 오른쪽 차원의 스트라이드가 1
(클래스)
사용자 정의 스트라이드를 갖는 레이아웃 매핑 정책
(클래스)
가장 왼쪽 차원보다 크거나 같은 패딩 스트라이드를 갖는 열 우선 레이아웃 매핑 정책
(클래스 템플릿)
가장 오른쪽 차원보다 크거나 같은 패딩 스트라이드를 갖는 행 우선 레이아웃 매핑 정책
(클래스 템플릿)
서브뷰 도우미
지정된 차원에서 모든 인덱스 범위를 설명하는 슬라이스 지정자 태그
(태그)
오프셋, 범위, 스트라이드로 표시되는 규칙적으로 간격이 있는 인덱스 집합을 나타내는 슬라이스 지정자
(클래스 템플릿)
submdspan_mapping 오버로드의 반환 타입
(클래스 템플릿)

추론 가이드

참고 사항

기능 테스트 매크로 표준 기능
__cpp_lib_mdspan 202207L (C++23) std::mdspan
__cpp_lib_submdspan 202306L (C++26) std::submdspan
202403L (C++26) std::mdspan 패딩된 레이아웃
__cpp_lib_aligned_accessor 202411L (C++26) std::aligned_accessor

예제

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("");
        }
    }
}

출력:

slice @ i = 0
0 1
2 3
4 5
slice @ i = 1
1000 1001
1002 1003
1004 1005

참고 항목

(C++20)
연속된 객체 시퀀스에 대한 비소유 뷰
(클래스 템플릿)
수치 배열, 배열 마스크 및 배열 슬라이스
(클래스 템플릿)