Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Предоставляет упрощенное представление по непрерывной последовательности объектов. 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>>>;