std:: mdspan
|
헤더에 정의됨
<mdspan>
|
||
|
template
<
class
T,
|
(C++23부터) | |
std::mdspan
는 다차원 인덱스를 배열의 요소에 매핑하는 다차원 배열 뷰입니다. 매핑 및 요소 접근 정책은 구성 가능하며, 기본 배열이 연속적일 필요는 없으며 메모리에 전혀 존재하지 않을 수도 있습니다.
각 전문화
MDS
는
mdspan
의
copyable
개념을 모델링하며 다음을 만족합니다:
-
- std:: is_nothrow_move_constructible_v < MDS > 가 true 이고,
- std:: is_nothrow_move_assignable_v < MDS > 가 true 이며,
- std:: is_nothrow_swappable_v < MDS > 가 true 입니다.
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) |
|
[static]
|
mdspan
의 동적 차원 수를 반환합니다
(public static member function) |
|
[static]
|
주어진 차원 인덱스에서
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) |
|
|
[static]
|
이 mdspan의 레이아웃 매핑이 항상 고유한지 확인합니다
(public static member function) |
|
[static]
|
이 mdspan의 레이아웃 매핑이 항상 완전한지 확인합니다
(public static member function) |
|
[static]
|
이 mdspan의 레이아웃 매핑이 항상 strided인지 확인합니다
(public static member function) |
비멤버 함수
|
(C++23)
|
mdspan에 대한
std::swap
알고리즘 특수화
(함수 템플릿) |
서브뷰 |
|
|
(C++26)
|
기존
mdspan
의 부분 집합에 대한 뷰를 반환함
(함수 템플릿) |
|
(C++26)
|
기존 extents와 슬라이스 지정자로부터 새로운 extents를 생성함
(함수 템플릿) |
헬퍼 타입 및 템플릿
|
(C++23)
|
특정 랭크의 다차원 인덱스 공간에 대한 기술자
(클래스 템플릿) |
|
(C++23)
(C++26)
|
모든 동적 차원을 갖는
std::extents
에 대한 편의 별칭 템플릿
(별칭 템플릿) |
|
(C++23)
|
mdspan
요소에 대한 인덱스 기반 접근을 위한 타입
(클래스 템플릿) |
|
(C++26)
|
mdspan
요소에 대한 정렬된 접근을 위한 타입
(클래스 템플릿) |
레이아웃 매핑 정책 |
|
|
(C++23)
|
열 우선 다차원 배열 레이아웃 매핑 정책; 가장 왼쪽 차원의 스트라이드가
1
(클래스) |
|
(C++23)
|
행 우선 다차원 배열 레이아웃 매핑 정책; 가장 오른쪽 차원의 스트라이드가
1
(클래스) |
|
(C++23)
|
사용자 정의 스트라이드를 갖는 레이아웃 매핑 정책
(클래스) |
|
(C++26)
|
가장 왼쪽 차원보다 크거나 같은 패딩 스트라이드를 갖는 열 우선 레이아웃 매핑 정책
(클래스 템플릿) |
|
(C++26)
|
가장 오른쪽 차원보다 크거나 같은 패딩 스트라이드를 갖는 행 우선 레이아웃 매핑 정책
(클래스 템플릿) |
서브뷰 도우미 |
|
|
(C++26)
|
지정된 차원에서 모든 인덱스 범위를 설명하는 슬라이스 지정자 태그
(태그) |
|
(C++26)
|
오프셋, 범위, 스트라이드로 표시되는 규칙적으로 간격이 있는 인덱스 집합을 나타내는 슬라이스 지정자
(클래스 템플릿) |
|
(C++26)
|
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)
|
연속된 객체 시퀀스에 대한 비소유 뷰
(클래스 템플릿) |
|
수치 배열, 배열 마스크 및 배열 슬라이스
(클래스 템플릿) |