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
의 요소 수입니다.
이 숫자는 아래 그림과 같이 템플릿 또는 함수에 대한 매개 변수로 지정할 수 있습니다.
반환 값
span
이 span
항목의 마지막 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_extent 0 . |
span(It first, size_type count) |
span 반복기에서 첫 번째 count 요소에서 생성합니다first . 템플릿 매개 변수 Extent 가 아닌 dynamic_extent 경우에만 오버로드 확인 중에 고려됩니다. |
span(It first, End last) |
span 끝에 last 도달할 때까지 반복기의 first 요소에서 생성합니다. 템플릿 매개 변수 Extent 가 아닌 dynamic_extent 경우에만 오버로드 확인 중에 고려됩니다. It 은 contiguous_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>>>;