Namespaces
Variants

std:: span

From cppreference.net
헤더 파일에 정의됨 <span>
template <

class T,
std:: size_t Extent = std:: dynamic_extent

> class span ;
(C++20부터)

클래스 템플릿 span 은 위치 0에서 시작하는 연속적인 객체 시퀀스를 참조할 수 있는 객체를 설명합니다. span static extent를 가질 수 있으며, 이 경우 시퀀스의 요소 개수가 컴파일 타임에 알려지고 타입에 인코딩되거나, dynamic extent를 가질 수 있습니다.

span s 에 대해, s 의 요소에 대한 포인터, 반복자, 참조는 [ s. data ( ) , s. data ( ) + s. size ( ) ) 범위 내의 포인터를 무효화하는 연산이 수행될 때 무효화됩니다.

std::span 의 모든 특수화는 TriviallyCopyable 타입입니다.

(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 >
  1. 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)
반복자
시작 부분을 가리키는 반복자를 반환한다
(public member function)
(C++23)
끝 부분을 가리키는 반복자를 반환한다
(public member function)
시작 부분을 가리키는 역방향 반복자를 반환한다
(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)

비멤버 함수

span 을 해당 바이트 뷰로 변환합니다
(함수 템플릿)

헬퍼 상수

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)
다차원 비소유 배열 뷰
(클래스 템플릿)
반복자-센티넬 쌍을 view 로 결합
(클래스 템플릿)
목록 초기화 에서 생성된 임시 배열 참조
(클래스 템플릿)
읽기 전용 문자열 뷰
(클래스 템플릿)