다음을 통해 공유


span 클래스(C++ 표준 라이브러리)

연속된 개체 시퀀스에 대한 간단한 보기를 제공합니다. A span 는 메모리에서 다시 정렬된 개체를 반복하고 인덱싱하는 안전한 방법을 제공합니다. 기본 제공 배열 std::array에 저장된 개체 또는 std::vector.

일반적으로 포인터와 인덱 span 스를 사용하여 연속 개체 시퀀스에 액세스하는 경우 보다 안전하고 간단한 대안입니다.

컴파일 시간에 템플릿 인수로 지정하거나 런타임에 지정하여 크기를 span 설정할 수 있습니다 dynamic_extent.

구문

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

템플릿 매개 변수

T
span 요소의 형식입니다.

Extent
컴파일 시간에 지정된 경우의 요소 span 수입니다. 그렇지 않으면 std::dynamic_extent 런타임에 요소 수를 지정합니다.

공제 가이드

멤버

형식 정의 설명
const_pointer 요소에 대한 포인터의 형식입니다 const .
const_reference 요소에 대한 참조의 형식입니다 const .
difference_type 두 요소 사이의 부호가 있는 거리의 형식입니다.
element_type 요소의 형식입니다 span .
iterator 에 대한 반복기의 형식입니다 span.
pointer 요소에 대한 포인터의 형식입니다.
reference 요소에 대한 참조의 형식입니다.
reverse_iterator 에 대한 역방향 반복기의 형식입니다 span.
size_type 에 있는 두 요소 span사이의 부호 없는 거리 결과에 대한 형식입니다.
value_type 요소의 형식(제외 const 또는 volatile 한정)입니다.
Constructor 설명
span 를 생성합니다 span.
반복기 지원 설명
begin 에서 첫 번째 요소를 가리키는 반복기를 가져옵니다 span.
end 의 끝을 가리키는 반복기를 가져옵니다 span.
rbegin 의 마지막 요소, 즉 역방향의 span시작을 가리키는 역방향 span반복기를 가져옵니다.
rend 앞면 span을 가리키는 역방향 반복기, 즉 역 span방향의 끝을 가져옵니다.
액세스 요소 설명
back 의 마지막 요소를 가져옵니다 span.
data 에서 첫 번째 요소 span의 주소를 가져옵니다.
front 의 첫 번째 요소를 가져옵니다 span.
operator[] 지정된 위치에 있는 요소에 액세스합니다.
관찰자 설명
empty 비어 있는지 테스트 span 합니다.
size 의 요소 span수를 가져옵니다.
size_bytes 바이트 단위의 span 크기를 가져옵니다.
하위 보기 설명
first 앞면 span에서 하위 범위를 가져옵니다.
last 의 뒷면 span에서 하위 범위를 가져옵니다.
subspan 의 어디에서나 하위 간격을 가져옵니다 span.
연산자 설명
span::operator= 을 바꿉다 span.
span::operator[] 지정된 위치에 있는 요소를 가져옵니다.

설명

모든 span 멤버 함수는 일정한 시간 복잡성을 갖습니다.

또는 달리array, a span 는 내부 요소를 "소유"하지 vector않습니다. A span 는 해당 개체에 대한 스토리지를 소유하지 않으므로 내부 항목에 대한 스토리지를 해제하지 않습니다.

요구 사항

헤더: <span> (C++20 이후)

네임스페이스: std

컴파일러 옵션: /std:c++20 이상이 필요합니다.

span::back

의 마지막 요소를 가져옵니다 span.

constexpr reference back() const noexcept;

반환 값

의 마지막 요소에 대한 참조입니다 span.

예시

#include <span>
#include <iostream>

using namespace std;

int main()
{
    int a[] = { 0,1,2 };
    span<int> mySpan(a);

    cout << mySpan.back();
}
2

span::begin

에서 첫 번째 요소를 가리키는 반복기를 가져옵니다 span.

constexpr iterator begin() const noexcept;

반환 값

의 첫 번째 요소를 span가리키는 반복기입니다.

예시

#include <span>
#include <iostream>

using namespace std;

int main()
{
    int a[] = { 0,1,2 };
    span<int> mySpan(a);

    auto i = mySpan.begin();
    cout << *i;
}
0

span::data

데이터의 시작 부분에 대한 포인터를 가져옵니다 span .

constexpr pointer data() const noexcept;

반환 값

에 저장된 첫 번째 항목에 대한 포인터입니다 span.

예시

#include <span>
#include <iostream>

using namespace std;

int main()
{
    int a[] = { 0,1,2 };
    span<int> mySpan(a);
    auto i = mySpan.data();
    cout << *i;
}
0

span::difference_type

에 있는 두 요소 사이의 요소 수입니다 span.

using difference_type = std::ptrdiff_t;

예시

#include <span>
#include <iostream>

int main()
{
    int a[] = { 0,1,2 };
    span<int> mySpan(a);

    span<int>::difference_type distance = mySpan.end() - mySpan.begin();
    cout << distance << std::endl;
}
3

span::element_type

span 요소의 형식입니다.

using element_type = T;

설명

형식은 만들 때 span 템플릿 매개 변수 T 에서 가져옵니다.

예시

#include <span>
#include <iostream>

using namespace std;

int main()
{
    int a[] = { 0,1,2 };
    span<int> mySpan(a);

    span<int>::element_type et = mySpan[2];
    cout << et << endl;
}
2

span::empty

요소 포함 span 여부입니다.

constexpr bool empty() const noexcept;

반환 값

경우this->size() == 0를 반환합니다true. 그렇지 않으면 false.

예시

#include <span>
#include <iostream>

using namespace std;

int main()
{
    int a[] = { 0,1,2 };
    span<int> mySpan(a);
    bool isEmpty = mySpan.empty(); // isEmpty == false
}

span::end

반복기를 .의 끝에 가져옵니다 span.

constexpr iterator end() const noexcept;

반환 값

의 끝 span바로 너머를 가리키는 반복기입니다.

설명

end는 반복기가 범위 끝을 통과했는지 여부를 테스트하는 데 사용됩니다.

이 반복기에서 반환된 값을 역참조하지 마세요. 반복기가 .의 마지막 요소를 span넘어 도달했는지 여부를 식별하는 데 사용합니다.

예시

// Iteration
for (auto it = s1.begin(); it != s1.end(); ++it)
{
    cout << *it;
}

span::first

span앞면에서 가져온 하위 범위를 가져옵니다.

constexpr auto first(size_type count) const noexcept;
template <size_t count> constexpr auto first() const noexcept;

매개 변수

count
하위 창에 넣을 요소 span 의 수입니다.
요소 수는 아래 그림과 같이 템플릿 또는 함수에 대한 매개 변수로 지정됩니다.

반환 값

span앞부분에 있는 요소가 들어 있는 A span 입니다count.

설명

가능한 경우 이 함수의 템플릿 버전을 사용하여 컴파일 시간에 유효성을 검사 count 하고 고정된 익스텐트를 반환 span 하므로 정보를 span 유지합니다.

예시

#include <span>
#include <iostream>

using namespace std;

int main()
{
    int a[] = { 0,1,2 };
    span<int> mySpan(a);

    auto first2 = mySpan.first(2);
    cout << "mySpan.first(2): ";
    for (auto& i : first2)
    {
        cout << i;
    }

    cout << "\nmySpan.first<2>: ";
    auto viewSpan = mySpan.first<2>();
    for (auto& i : viewSpan)
    {
        cout << i;
    }
}
mySpan.first(2): 01
mySpan.first<2>: 01

span::front

의 첫 번째 요소를 가져옵니다 span.

constexpr reference front() const noexcept;

반환 값

의 첫 번째 요소에 대한 참조입니다 span.

예시

#include <span>
#include <iostream>

using namespace std;

int main()
{
    int a[] = { 0,1,2 };
    span<int> mySpan(a);

    auto i = mySpan.front();
    cout << i;
}
0

span::iterator

over span 요소의 iterator 형식입니다.

using iterator = implementation-defined-iterator-type;

설명

이 형식은 에 있는 iterator 오버 요소로 span사용됩니다.

예시

#include <span>
#include <iostream>

using namespace std;

int main()
{
    int a[] = { 0,1,2 };
    span<int> mySpan(a);

    span<int>::iterator it = mySpan.begin();
    cout << *it++ << *it++ << *it;
}
012

span::last

span끝부분에서 가져온 하위 범위를 가져옵니다.

constexpr span<element_type, dynamic_extent> last(const size_type count) const noexcept;
template <size_t count> constexpr span<element_type, count> last() const noexcept;

매개 변수

count
하위 창에 넣을 끝 span 의 요소 수입니다. 이 숫자는 아래 그림과 같이 템플릿 또는 함수에 대한 매개 변수로 지정할 수 있습니다.

반환 값

spanspan항목의 마지막 count 요소를 포함하는 A.

설명

가능한 경우 이 함수의 템플릿 버전을 사용하여 컴파일 시간에 유효성을 검사 count 하고 고정된 익스텐트를 반환 span 하므로 정보를 span 유지합니다.

예시

#include <span>
#include <iostream>

using namespace std;

int main()
{
    int a[] = { 0,1,2 };
    span<int> mySpan(a);

    auto first2 = mySpan.last(2);
    cout << "mySpan.last(2): ";
    for (auto& i : last2)
    {
        cout << i;
    }

    cout << "\nmySpan.last<2>: ";
    auto viewSpan = mySpan.last<2>();
    for (auto& i : viewSpan)
    {
        cout << i;
    }
}
mySpan.last(2): 12
mySpan.last<2>: 12

span::operator[]

지정된 위치에 있는 span 요소를 가져옵니다.

constexpr reference operator[](size_type offset) const;

매개 변수

offset
액세스하려면 0부터 시작하는 요소입니다 span .

반환 값

위치에 offset있는 요소에 대한 참조입니다. 위치가 유효하지 않으면 동작이 정의되지 않습니다.

예시

#include <span>
#include <iostream>

using namespace std;

int main()
{
    int a[] = { 0,1,2 };
    span<int> mySpan(a);
    cout << mySpan[1];
}
1

span::operator=

이 값에 다른 span 할당을 지정합니다.

constexpr span& operator=(const span& other) noexcept = default;

매개 변수

other
span 이 할당에 할당할 수 있습니다.

반환 값

*this

설명

할당은 데이터 포인터 및 크기의 단순 복사본을 수행합니다. 단순 복사본은 포함된 요소에 span 대한 메모리를 할당하지 않으므로 안전합니다.

예시

#include <span>
#include <iostream>

using namespace std;

int main()
{
    int a[] = { 0,1,2 };
    span<int> mySpan(a);
    span<int> mySpan2;
    mySpan2 = mySpan;
    for (auto &i : mySpan2)
    {
        cout << it;
    }
}
012

span::pointer

요소에 대한 포인터 및 const 포인터의 형식입니다 span .

using pointer = T*;
using const_pointer = const T*;

예시

#include <span>
#include <iostream>

using namespace std;

int main()
{
    int a[] = { 0,1,2 };
    span<int> mySpan(a);

    // pointer
    span<int>::pointer ptr = &mySpan[2];
    *ptr = 9;
    cout << mySpan[2];

    // const pointer
    span<int>::const_pointer cPtr = &mySpan[0];
    // *cPtr = 9; error - const
    cout << *cPtr;
}
90

span::rbegin

span항목의 마지막 요소를 가리키는 역방향 반복기를 가져옵니다.

constexpr reverse_iterator rbegin() const noexcept;

반환 값

역방향 span의 시작을 가리키는 반복기입니다.

예시

#include <span>
#include <iostream>

using namespace std;

int main()
{
    int a[] = { 0,1,2 };
    span<int> mySpan(a);

    for (auto rIt = s1.rbegin(); rIt != s1.rend(); ++rIt)
    {
        cout << *rIt;
    }
}
210

span::reference

요소에 대한 참조 및 const 참조의 형식입니다 span .

using reference = T&;
using const_reference = const T&;

예시

#include <span>
#include <iostream>

using namespace std;

int main()
{
    int a[] = { 0,1,2 };
    span<int> mySpan(a);

    // reference
    span<int>::reference ref = mySpan[0];
    ref = 9;
    cout << mySpan[0];
    // const reference
    span<int>::const_reference cRef = mySpan[1];
    // cRef = 9; error because const
    cout << cRef;
}
91

span::rend

역방향 span의 끝 바로 다음을 가리키는 임의 액세스 반복기를 가져옵니다.

constexpr reverse_iterator rend() const noexcept;

반환 값

역방향의 마지막 요소 다음에 나오는 자리 표시자에 대한 역방향 반복기입니다. 즉, 역span방향 span요소의 첫 번째 요소 앞에 있는 자리 표시자입니다.

설명

rend는 .와 함께 사용되는 것처럼 span::end 역방향 span 으로 span사용됩니다. 이를 사용하여 역방향 반복기가 해당 반복기의 끝에 도달했는지 여부를 테스트합니다 span.

반환된 rend 값은 역참조하면 안 됩니다.

예시

#include <span>
#include <iostream>

using namespace std;

int main()
{
    int a[] = { 0,1,2 };
    span<int> mySpan(a);

    for (auto rIt = s1.rbegin(); rIt != s1.rend(); ++rIt)
    {
        cout << *rIt;
    }
}

span::reverse_iterator

에 대한 역방향 반복기의 형식입니다 span.

using reverse_iterator = std::reverse_iterator<iterator>;

예시

#include <span>
#include <iostream>

int main()
{
    int a[] = { 0,1,2 };
    span<int> mySpan(a);

    span<int>::reverse_iterator rIt = mySpan.rbegin();
    cout << *rIt++ << *rIt++ << *rIt;
}
210

span::size

의 요소 span수를 가져옵니다.

constexpr size_t size() const noexcept;

반환 값

span의 요소 수입니다.

예시

#include <span>
#include <iostream>

using namespace std;

int main()
{
    int a[] = { 0,1,2 };
    span<int> mySpan(a);
    cout << mySpan.size();
}
3

span::size_bytes

요소의 크기를 바이트 단위로 span 가져옵니다.

constexpr size_type size_bytes() const noexcept;

반환 값

모든 요소가 span 차지하는 바이트 수입니다. 즉, sizeof(element_type) 요소의 수를 곱합니다 span.

예시

#include <span>
#include <iostream>

using namespace std;

int main()
{
    int a[] = { 0,1,2 };
    span<int> mySpan(a);
    cout << mySpan.size_bytes(); // 3 elements * 4 (size of an int)
}
12

span::size_type

에 요소 수를 저장하는 데 적합한 부호 없는 형식입니다 span.

using size_type = size_t;

예시

#include <span>
#include <iostream>

using namespace std;

int main()
{
    int a[] = { 0,1,2 };
    span<int> mySpan(a);

    span<int>::size_type szType = mySpan.size();
    cout << szType;
}
3

span::span

span 생성자.

constexpr span() noexcept
requires (Extent == 0 || Extent == dynamic_extent) = default;

template <class It>
constexpr explicit(Extent != dynamic_extent)
span(It first, size_type count) noexcept

template <class It, class End>
constexpr explicit(Extent != dynamic_extent)
span(It first, End last) noexcept(noexcept(last - first))

template <class T, size_t N>
requires (Extent == dynamic_extent || Extent == N) && is_convertible_v<T (*)[], T (*)[]>
constexpr span(array<T, N>& arr) noexcept

template <class T, size_t N>
requires (Extent == dynamic_extent || Extent == N) && is_convertible_v<const T (*)[], T (*)[]>
constexpr span(const array<T, N>& arr) noexcept

template <size_t N>
requires (Extent == dynamic_extent || Extent == N)
constexpr span(type_identity_t<T> (&arr)[N]) noexcept

template <class R>
constexpr explicit(Extent != dynamic_extent)
span(R&& r)

// default copy ctor
constexpr span(const span& other) noexcept = default;

// converting  ctor
template <class T, size_t OtherExtent>
requires (Extent == dynamic_extent || OtherExtent == dynamic_extent ||
              Extent == OtherExtent) && is_convertible_v<T (*)[], T (*)[]>
constexpr explicit(Extent != dynamic_extent && OtherExtent == dynamic_extent)
span(const span<T, OtherExtent>& other) noexcept

매개 변수

arr
span 배열에서 생성합니다.

count
에 있을 span요소 수입니다.

first
의 첫 번째 요소에 대한 span반복기입니다.

last
에서 마지막 요소를 span지나는 반복기입니다.

N
에 있을 span요소의 수입니다.

other
span복사본을 만듭니다.

r
범위R에서 생성 span 합니다.

설명

A span 는 해당 항목 내의 개체 스토리지를 span 소유하지 않으므로 항목에 대한 스토리지를 해제하지 않습니다.

생성자 Description
span() span. 템플릿 매개 변수 Extent 가 있는 경우 오버로드 확인 중에만 고려됩니다dynamic_extent0.
span(It first, size_type count) span 반복기에서 첫 번째 count 요소에서 생성합니다first. 템플릿 매개 변수 Extent 가 아닌 dynamic_extent경우에만 오버로드 확인 중에 고려됩니다.
span(It first, End last) span 끝에 last 도달할 때까지 반복기의 first 요소에서 생성합니다. 템플릿 매개 변수 Extent 가 아닌 dynamic_extent경우에만 오버로드 확인 중에 고려됩니다. Itcontiguous_iterator이어야 합니다.
span(array<T, N>& arr) noexcept;

span(const array<T, N>& arr) noexcept;

span(type_identity_t<element_type> (&arr)[N]) noexcept;
span 지정된 배열의 요소에서 N 생성합니다. 템플릿 매개 변수 Extent dynamic_extent 가 같거나 같은 경우 오버로드 확인 중에만 고려됩니다 N.
span(R&& r) 범위에서 생성 span 합니다. 템플릿 매개 변수 Extent 가 아닌 dynamic_extent경우에만 오버로드 확인에 참여합니다.
span(const span& other) 컴파일러에서 생성된 복사 생성자입니다. 데이터 포인터의 단순 복사본은 요소를 저장할 메모리를 span 할당하지 않으므로 안전합니다.
span(const span<OtherElementType, OtherExtent>& s) noexcept; 생성자 변환: 다른 span생성자 span 에서 생성합니다. 템플릿 매개 변수 Extent dynamic_extent가 있거나 같거나 N dynamic_extent 같은 경우에만 오버로드 확인에 참여합니다 Extent.

예시

#include <span>

using namespace std;

int main()
{
    const int MAX=10;

    int x[MAX];
    for (int i = 0; i < MAX; i++)
    {
        x[i] = i;
    }

    span<int, MAX> span1{ x }; // fixed-size span: compiler error if size of x doesn't match template argument MAX
    span<int> span2{ x }; // size is inferred from x
    span<const int> span3 = span2; // converting constructor
    span<int> span4( span2 ); // copy constructor
}

span::subspan

span하위 범위를 가져옵니다.

constexpr auto subspan(size_type offset, size_type count = dynamic_extent) const noexcept;

template <size_t offset, size_t count = dynamic_extent>
constexpr auto subspan() const noexcept

매개 변수

count
하위 창에 넣을 요소의 수입니다. 이 경우count(기본값) 하위 범위가 이 span끝부분으로 offset 이동 dynamic_extent 됩니다.

offset
하위 간격을 시작할 위치 span 입니다.

반환 값

span 시작span입니다offset. 요소를 포함합니다 count .

설명

이 함수의 템플릿 버전은 컴파일 시간에 개수를 검사하여 고정 익스텐트를 반환하여 해당 span 정보를 보존하는 span 데 사용할 수 있습니다.

예시

#include <span>
#include <iostream>

using namespace std;

int main()
{
    int a[] = { 0,1,2 };
    span<int> mySpan(a);

    cout << "mySpan.subspan(1,2): ";
    for (auto& i : mySpan.subspan(1,2))
    {
        cout << i;
    }
    cout << "\nmySpan.subspan<1,2>: ";
    for (auto& i : mySpan.subspan<1,2>())
    {
        cout << i;
    }
    cout << "\nmySpan.subspan<1>: ";
    for (auto& i : mySpan.subspan<1>)
    {
        cout << i;
    }
}
mySpan.subspan(1,2): 12
mySpan.subspan<1,2>: 12
mySpan.subspan<1>: 12

span::value_type

형식이 없거나 const volatile 한정된 span요소의 형식입니다.

using value_type = std::remove_cv_t<T>;

예시

#include <span>
#include <iostream>

using namespace std;

int main()
{
    int a[] = { 0,1,2 };
    span<int> mySpan(a);

    span<int>::value_type vType = mySpan[2];
    cout << vType;
}
2

공제 가이드

다음 공제 가이드가 제공됩니다 span.

// Allows the extent to be deduced from std::array and C++ built-in arrays

template <class T, size_t Extent>
span(T (&)[Extent]) -> span<T, Extent>;

template <class T, size_t Size>
span(array<T, Size>&) -> span<T, Size>;

template <class T, size_t Size>
span(const array<T, Size>&) -> span<const T, Size>;

// Allows the element type to be deduced from the iterator and the end of the span.
// The iterator must be contiguous

template <contiguous_iterator It, class End>
span(It, End) -> span<remove_reference_t<iter_reference_t<It>>>;

// Allows the element type to be deduced from a range.
// The range must be contiguous

template <ranges::contiguous_range Rng>
span(Rng &&) -> span<remove_reference_t<ranges::range_reference_t<Rng>>>;

참고 항목

<span>
클래스 템플릿 인수 추론을 사용하는 방법