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 등에서 자동으로 구성할 수 있어요.