span

span (std::span — 연속 원소 뷰)

std::span은 연속된 객체 시퀀스에 대한 관점(view)을 제공하는 비소유(non-owning) 뷰예요. std::array, std::vector, C 배열 등 연속 메모리를 가리키며 소유하지 않아요.

출처: cppreference

본문

std::span는 C++20에서 도입된 비소유 뷰로, 연속된 객체 시퀀스에 대한 "창" 역할을 해요. 다음 특징이 있어요.

  • 포인터와 크기(길이)로 구성되며, 소유하지 않아요(non-owning). 원소 수명에 관여하지 않아요.
  • std::array, std::vector, C 배열 등을 span으로 변환해 함수 인자로 넘길 수 있어요.
  • std::span 자체는 모든 멤버 함수가 constexpr이라 컴파일 타임에도 쓸 수 있어요.
  • 문자열 리터럴 등에는 std::string_view를 쓰고, 바이너리 데이터 뷰에는 span을 주로 써요.

span은 "보기만 하는" 뷰이므로, 원소를 수정하려면 T가 비-const 타입의 span이어야 해요. const span<T>span<const T>는 구별돼요.

템플릿 매개변수

  • T: 원소 타입.
  • Extent: 컴파일 타임 크기(std::dynamic_extent면 동적 크기).

멤버 타입

  • element_type, value_type, size_type, difference_type
  • pointer, const_pointer, reference, const_reference
  • iterator, const_iterator, reverse_iterator, const_reverse_iterator

멤버 함수

  • 생성자, operator=
  • 원소 접근: front, back, operator[], data
  • 이터레이터: begin, end, rbegin, rend
  • 관찰자: size, size_bytes, empty
  • 부분 뷰: first, last, subspan

비멤버 함수

  • std::as_bytes, std::as_writable_bytes: 원소를 바이트 뷰로 재해석
  • 범위 인자로 받는 모든 std::ranges 알고리즘에 span을 그대로 넘길 수 있어요.

더 알아보기 (Learn more)

cppreference