std:: span
|
헤더 파일에 정의됨
<span>
|
||
|
template
<
class
T,
|
(C++20부터) | |
클래스 템플릿
span
은 위치 0에서 시작하는 연속적인 객체 시퀀스를 참조할 수 있는 객체를 설명합니다.
span
은
static
extent를 가질 수 있으며, 이 경우 시퀀스의 요소 개수가 컴파일 타임에 알려지고 타입에 인코딩되거나,
dynamic
extent를 가질 수 있습니다.
span
s
에 대해,
s
의 요소에 대한 포인터, 반복자, 참조는
[
s.
data
(
)
,
s.
data
(
)
+
s.
size
(
)
)
범위 내의 포인터를 무효화하는 연산이 수행될 때 무효화됩니다.
|
|
(C++23부터) |
목차 |
템플릿 매개변수
| T | - | 요소 타입; 추상 클래스 타입이 아닌 완전한 객체 타입이어야 함 |
| Extent | - |
시퀀스의 요소 개수, 또는 동적일 경우
std::dynamic_extent
|
중첩 타입
| 유형 | 정의 |
element_type
|
T
|
value_type
|
std:: remove_cv_t < T > |
size_type
|
std::size_t |
difference_type
|
std::ptrdiff_t |
pointer
|
T * |
const_pointer
|
const T * |
reference
|
T & |
const_reference
|
const T & |
iterator
[1]
|
구현 정의
LegacyRandomAccessIterator
,
ConstexprIterator
, 및
contiguous_iterator
이며,
value_type
이
value_type
인 반복자
|
const_iterator
(C++23부터)
|
std:: const_iterator < iterator > |
reverse_iterator
|
std:: reverse_iterator < iterator > |
const_reverse_iterator
(C++23부터)
|
std:: const_iterator < reverse_iterator > |
-
↑
iterator는T가 const 한정자가 아닌 경우 변경 가능한 반복자입니다.
Container
에 대한 반복자 타입의 모든 요구사항은
span
의
iterator
타입에도 동일하게 적용됩니다.
데이터 멤버
| 멤버 | 설명 |
|
constexpr
std::
size_t
extent
[static]
|
Extent
(public static member constant) |
pointer
data_
|
기반 시퀀스를 가리키는 포인터
( 설명 전용 멤버 객체* ) |
size_type
size_
(extent가 dynamic 인 경우에만 존재) |
요소의 개수
( 설명 전용 멤버 객체* ) |
멤버 함수
span
을 생성한다
(public member function) |
|
span
을 할당한다
(public member function) |
|
|
(destructor)
(implicitly declared)
|
span
을 소멸시킨다
(public member function) |
반복자 |
|
|
(C++23)
|
시작 부분을 가리키는 반복자를 반환한다
(public member function) |
|
(C++23)
|
끝 부분을 가리키는 반복자를 반환한다
(public member function) |
|
(C++23)
|
시작 부분을 가리키는 역방향 반복자를 반환한다
(public member function) |
|
(C++23)
|
끝 부분을 가리키는 역방향 반복자를 반환한다
(public member function) |
요소 접근 |
|
|
첫 번째 요소에 접근한다
(public member function) |
|
|
마지막 요소에 접근한다
(public member function) |
|
|
(C++26)
|
범위 검사를 수행하며 지정된 요소에 접근한다
(public member function) |
|
지정된 요소에 접근한다
(public member function) |
|
|
내부 연속 저장소에 직접 접근한다
(public member function) |
|
관찰자 |
|
|
요소의 개수를 반환한다
(public member function) |
|
|
시퀀스의 바이트 크기를 반환한다
(public member function) |
|
|
시퀀스가 비어 있는지 확인한다
(public member function) |
|
부분 뷰 |
|
시퀀스의 첫 번째
N
개 요소로 구성된 부분 span을 얻는다
(public member function) |
|
시퀀스의 마지막
N
개 요소로 구성된 부분 span을 얻는다
(public member function) |
|
|
부분 span을 얻는다
(public member function) |
|
비멤버 함수
|
(C++20)
|
span
을 해당 바이트 뷰로 변환합니다
(함수 템플릿) |
헬퍼 상수
|
(C++20)
|
std::size_t
타입의 상수로,
span
이 동적 범위(dynamic extent)를 가짐을 나타냄
(상수) |
헬퍼 템플릿
|
template
<
class
T,
std::
size_t
Extent
>
constexpr bool ranges:: enable_borrowed_range < std :: span < T, Extent >> = true ; |
(C++20 이후) | |
ranges::enable_borrowed_range
의 이 특수화는
span
이
borrowed_range
를 만족하도록 합니다.
|
template
<
class
T,
std::
size_t
Extent
>
constexpr bool ranges:: enable_view < std :: span < T, Extent >> = true ; |
(C++20 이후) | |
이 특수화는
ranges::enable_view
가
span
이
view
를 만족하도록 합니다.
추론 가이드
참고 사항
std::span
의 특수화는 C++23에서 공식 요구사항이 도입되기 전부터 이미 모든 기존 구현에서 사소하게 복사 가능한 타입입니다.
| 기능 테스트 매크로 | 값 | 표준 | 기능 |
|---|---|---|---|
__cpp_lib_span
|
202002L
|
(C++20) |
std::span
|
202311L
|
(C++26) | std::span::at | |
__cpp_lib_span_initializer_list
|
202311L
|
(C++26) |
std::span
생성
std::initializer_list
에서
|
예제
이 예제는 연속 범위에서 일부 알고리즘을 구현하기 위해
std::span
을 사용합니다.
#include <algorithm> #include <cstddef> #include <iostream> #include <span> template<class T, std::size_t N> [[nodiscard]] constexpr auto slide(std::span<T, N> s, std::size_t offset, std::size_t width) { return s.subspan(offset, offset + width <= s.size() ? width : 0U); } template<class T, std::size_t N, std::size_t M> constexpr bool starts_with(std::span<T, N> data, std::span<T, M> prefix) { return data.size() >= prefix.size() && std::equal(prefix.begin(), prefix.end(), data.begin()); } template<class T, std::size_t N, std::size_t M> constexpr bool ends_with(std::span<T, N> data, std::span<T, M> suffix) { return data.size() >= suffix.size() && std::equal(data.end() - suffix.size(), data.end(), suffix.end() - suffix.size()); } template<class T, std::size_t N, std::size_t M> constexpr bool contains(std::span<T, N> span, std::span<T, M> sub) { return std::ranges::search(span, sub).begin() != span.end(); } void println(const auto& seq) { for (const auto& elem : seq) std::cout << elem << ' '; std::cout << '\n'; } int main() { constexpr int a[]{0, 1, 2, 3, 4, 5, 6, 7, 8}; constexpr int b[]{8, 7, 6}; constexpr static std::size_t width{6}; for (std::size_t offset{}; ; ++offset) if (auto s = slide(std::span{a}, offset, width); !s.empty()) println(s); else break; static_assert("" && starts_with(std::span{a}, std::span{a, 4}) && starts_with(std::span{a + 1, 4}, std::span{a + 1, 3}) && !starts_with(std::span{a}, std::span{b}) && !starts_with(std::span{a, 8}, std::span{a + 1, 3}) && ends_with(std::span{a}, std::span{a + 6, 3}) && !ends_with(std::span{a}, std::span{a + 6, 2}) && contains(std::span{a}, std::span{a + 1, 4}) && !contains(std::span{a, 8}, std::span{a, 9}) ); }
출력:
0 1 2 3 4 5 1 2 3 4 5 6 2 3 4 5 6 7 3 4 5 6 7 8
결함 보고서
다음 동작 변경 결함 보고서는 이전에 게시된 C++ 표준에 소급 적용되었습니다.
| DR | 적용 대상 | 게시된 동작 | 올바른 동작 |
|---|---|---|---|
| LWG 3203 | C++20 |
span
요소에 대한 포인터, 반복자, 참조가
무효화되는 시점이 불명확했음 |
명확히 규정됨 |
| LWG 3903 | C++20 |
span
의 소멸자 선언이 불필요했음
|
선언 제거됨 |
| P2325R3 | C++20 |
정적 크기가 0이 아닌
span
이
view
가 아니었음
|
모든
span
이
view
가 됨
|
참고 항목
|
(C++23)
|
다차원 비소유 배열 뷰
(클래스 템플릿) |
|
(C++20)
|
반복자-센티넬 쌍을
view
로 결합
(클래스 템플릿) |
|
(C++11)
|
목록 초기화
에서 생성된 임시 배열 참조
(클래스 템플릿) |
|
(C++17)
|
읽기 전용 문자열 뷰
(클래스 템플릿) |