span
class (стандартная библиотека 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
, если число элементов будет указано во время выполнения.
Участники
Определения типов | Description |
---|---|
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 квалификации. |
Конструктор | Description |
span |
Создайте span |
Поддержка итератора | Description |
begin |
Получение итератора, указывающего на первый элемент в элементе span . |
end |
Получение итератора, указывающего на конец span . |
rbegin |
Получите обратный итератор, указывающий на последний элемент span ; то есть начало обратного span . |
rend |
Получите обратный итератор, указывающий на передний span план; то есть конец обратного span . |
Элементы Access | Description |
back |
Получение последнего элемента в элементе span . |
data |
Получение адреса первого элемента в элементе span . |
front |
Получение первого элемента в элементе span . |
operator[] |
Доступ к элементу в указанной позиции. |
Наблюдателей | Description |
empty |
Проверьте, является ли пустой span . |
size |
Получение количества элементов в элементе span . |
size_bytes |
Получите размер span в байтах. |
Вложенные представления | Description |
first |
Получите подсеть с передней span части. |
last |
Получите подсеть с задней span стороны. |
subspan |
Получение подспанея из любого места в span . |
Операторы | Description |
span::operator= |
Замените span . |
span::operator[] |
Получите элемент в указанной позиции. |
Замечания
Все span
функции-члены имеют постоянную сложность времени.
В отличие array
от или vector
, не span
"владеет" элементами внутри него. Не 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;
Замечания
Тип берется из параметра T
шаблона при span
создании.
Пример
#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;
Возвращаемое значение
Возвращает значение true
, если this->size() == 0
. В противном случае — значение 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
содержащий count
элементы с передней части этого span
элемента.
Замечания
Используйте версию шаблона этой функции, если это возможно, чтобы проверить 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
Тип iterator
элементов над span
элементами.
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
последние count
элементы из этого span
элемента.
Замечания
Используйте версию шаблона этой функции, если это возможно, чтобы проверить 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
Отсчитываемый от нуля элемент в доступе 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
так же, как span::end
используется с 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
Создайте объект span
из диапазона R
.
Замечания
Не span
освобождает хранилище для элементов в span
нем, так как оно не владеет хранилищем объектов в нем.
Конструктор | Description |
---|---|
span() |
Создание пустого span . Учитывается только во время разрешения перегрузки, если параметр Extent шаблона или 0 dynamic_extent . |
span(It first, size_type count) |
span Создайте из первых count элементов из итератораfirst . Учитывается только во время разрешения перегрузки, если параметр Extent шаблона не dynamic_extent является. |
span(It first, End last) |
span Создайте элемент из элементов в итераторе first до достижения концаlast . Учитывается только во время разрешения перегрузки, если параметр 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 элементов указанного массива. При разрешении N перегрузки учитывается только в том случае, если параметр Extent шаблона равен dynamic_extent или равен. |
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
значение dynamic_extent
равно (значение по умолчанию), то подпансеть берется с offset
конца этого span
.
offset
Расположение в этом span
расположении для запуска подпане.
Возвращаемое значение
Начиная span
с offset
этого span
. Содержит 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
Тип элемента в элементе span
без const
или volatile
квалификации.
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>>>;