std::span

std::span (연속 시퀀스 비소유 뷰)

연속된 객체 시퀀스를 참조할 수 있는 객체를 설명하는 클래스 템플릿이에요. 첫 원소가 0번 위치예요. 원소를 소유하지 않는 경량 뷰(view)로, 배열·벡터 등의 연속 저장을 안전하게 넘겨받는 데 쓰여요. C++20부터 있어요.

출처: cppreference

본문

<span> 헤더에 정의돼 있고, 연속 시퀀스에 대한 비소유 뷰예요.

template<
    class T,
    std::size_t Extent = std::dynamic_extent
> class span;

클래스 템플릿 span은 첫 원소가 0번 위치인 연속된 객체 시퀀스를 참조할 수 있는 객체를 설명해요. span은 정적 범위(static extent)를 가질 수 있는데, 그 경우 시퀀스 안의 원소 개수가 컴파일 타임에 알려지고 타입에 인코딩돼요. 또는 동적 범위(dynamic extent)를 가질 수도 있어요.

span s에 대해, [s.data(), s.data() + s.size()) 범위 안의 포인터를 무효화하는 어떤 연산이 발생하면 s의 원소에 대한 포인터·반복자·참조도 무효화돼요. C++23부터 std::span의 모든 특수화는 TriviallyCopyable 타입이에요.

템플릿 매개변수

  • 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: 구현 정의, LegacyRandomAccessIterator·ConstexprIterator·contiguous_iterator. (T가 const가 아니면 변경 가능한 반복자.)
  • const_iterator(C++23) = std::const_iterator<iterator>, reverse_iterator = std::reverse_iterator<iterator>, const_reverse_iterator(C++23) = std::const_iterator<reverse_iterator>.

데이터 멤버

  • extent [static]: Extent.
  • data_: 기본 시퀀스를 가리키는 포인터 (설명 전용).
  • size_: 원소 수 (범위가 동적일 때만 존재, 설명 전용).

멤버 함수

  • 생성자, operator=, (암시적) 소멸자.
  • 반복자: begin/cbegin, end/cend, rbegin/crbegin, rend/crend.
  • 원소 접근: front, back, at(C++26, 범위 검사), operator[], data.
  • 관찰자: size, size_bytes, empty, first, last, subspan(하위 뷰 추출).

span은 배열이나 컨테이너의 원소를 소유하지 않으면서 연속된 메모리에 대한 뷰를 제공해요. 함수 인자로 연속 버퍼를 넘길 때 복사 없이 전달할 수 있어 안전하고, std::array, C 배열, std::vector 등에서 자동으로 구성할 수 있어요.

더 알아보기 (Learn more)

cppreference