QSpan 类

template <typename T, std::size_t E = std::size_t(-1)> class QSpan

连续数据的非拥有容器。 更多信息...

头文件 #include <QSpan>
CMakefind_package(Qt6 REQUIRED COMPONENTS Core)
target_link_libraries(mytarget PRIVATE Qt6::Core)
qmakeQT += core
Qt 6.7

注意:此类中的所有函数都是重入的

公共类型

公共函数

QSpan(It first, qsizetype count)
QSpan(It first, It last)
QSpan(q20::type_identity_t<T> (&)[N] arr)
QSpan(std::array<S, N> &arr)
QSpan(const std::array<S, N> &arr)
QSpan(Range &&r)
QSpan(QSpan<S, N> other)
QSpan(std::span<S, N> other)
QSpan(std::initializer_list<QSpan<T, E>::value_type> il)
QSpan()
QSpan(const QSpan<T, E> &other)
QSpan(QSpan<T, E> &&other)
~QSpan()
QSpan<T, E>::referenceback() const
QSpan<T, E>::iteratorbegin() const
QSpan<T, E>::const_iteratorcbegin() const
QSpan<T, E>::const_iteratorcend() const
QSpan<T, E>::const_reverse_iteratorcrbegin() const
QSpan<T, E>::const_reverse_iteratorcrend() const
QSpan<T, E>::pointerdata() const
boolempty() const
QSpan<T, E>::iteratorend() const
QSpan<T, Count>first() const
QSpan<T>first(QSpan<T, E>::size_type n) const
QSpan<T, E>::referencefront() const
boolisEmpty() const
QSpan<T, Count>last() const
QSpan<T>last(QSpan<T, E>::size_type n) const
QSpan<T, E>::reverse_iteratorrbegin() const
QSpan<T, E>::reverse_iteratorrend() const
QSpan<T, E>::size_typesize() const
QSpan<T, E>::size_typesize_bytes() const
QSpan<T>sliced(QSpan<T, E>类型::size_type pos) const
QSpan<T>sliced(QSpan<T, E>类型::size_type pos, QSpan<T, E>类型::size_type n) const
autosubspan() const
autosubspan() const
QSpan<T>subspan(QSpan<T, E>类型::size_type pos) const
QSpan<T>subspan(QSpan<T, E>类型::size_type pos, QSpan<T, E>类型::size_type n) const
QSpan<T, E> &operator=(const QSpan<T, E> &other)
QSpan<T, E> &operator=(QSpan<T, E> &&other)
QSpan<T, E>::referenceoperator[](QSpan<T, E>类型::size_type idx) const

静态公共成员

const std::size_t范围

详细描述

QSpan引用另一个连续容器的连续部分。它为所有类型的连续容器提供了一个接口类型,无需先构造拥有容器的对象,例如QList或std::vector。

QSpan引用的数据可以表示为一个数组(或与数组兼容的数据结构,如QList,std::vector,QVarLengthArray等)。QSpan本身仅存储数据指针,因此用户必须确保QSpan对象不会超出它们引用的数据的范围。

QStringViewQLatin1StringViewQUtf8StringView这样的视图不同,可以通过QSpan对象修改引用的数据。为了防止这种情况,构造一个覆盖const T的QSpan

int numbers[] = {0, 1, 2};
QSpan<int> span = numbers;
span[0] = 42;
// numbers == {42, 1, 2};
QSpan<const int> cspan = numbers;
cspan[0] = 0; // ERROR: cspan[0] is read-only

QSpan可以是固定大小可变大小的。

如上例所示,通过省略第二个模板参数(或将它设置为std::dynamic_extent,但仅在C++20构建中可用)来形成可变大小的span。

通过传递一个数字作为第二个模板参数形成固定大小的span

int numbers[] = {0, 1, 2};
QSpan<int, 3> span = numbers;
QSpan<const int, 3> = numbers; // also OK

正如其名所示,固定大小span的size()在编译时是固定的,而可变大小span的size()仅在运行时确定。

固定大小span不可默认构造(除非其范围为零(0))。可变大小span可默认构造的,并将具有data() == nullptrsize() == 0

固定大小span可以隐式转换为可变大小span。反方向的(可变长度转换为固定长度)有先决条件,即两个span的大小必须匹配。

与拥有容器的不同,在QSpan中const浅层的:您仍然可以通过const QSpan修改数据(但不能通过QSpan<const T>),并且begin()和end()没有在const/non-const上重载。但是,有cbegin()和cend(),返回const迭代器,这即使在T不是const的情况下也可以防止修改数据。

int numbers[] = {0, 1, 2};
const QSpan<int> span = numbers;
span.front() = 42;   // OK, numbers[0] == 42 now
*span.begin() = 31;  // OK, numbers[0] == 31 now
*span.cbegin() = -1; // ERROR: cannot assign through a const_iterator

应该通过值传递QSpan,而不是通过const引用传递

void consume(QSpan<const int> data); // OK
void consume(const QSpan<const int> &data); // works, but is non-idiomatic and less efficient

QSpan<T,N>是一个字面量类型,无论T是否是字面量类型。

QSpan和std::span

QSpan是在std::span的基础上构建的,但有一些不同之处,我们将在下面讨论。由于它们都可以隐式转换为对方,因此您可以根据自己的代码喜欢其中的任何一个。

  • QSpan使用有符号的qsizetype作为size_type,而std::span使用size_t。
  • 所有QSpan构造函数都是隐式的;很多std::span构造函数都是显式的。
  • QSpan可以由右值拥有容器构造,而std::span不能。

最后两个在将接收拥有容器的函数转换为接收QSpan时,保证了源代码的兼容性,这对于Qt来说是一个至关重要的用例。使用qsizetype是为了与Qt容器中的其他部分保持一致。QSpan模板参数仍然使用size_t来避免引入不必要的错误条件(负的大小)。

兼容迭代器

如果迭代器是兼容的,QSpan可以从一个迭代器和大小或从一个迭代器对构造。最终,这应该意味着C++20 std::contiguous_iteratorstd::sentinel_for,但在Qt仍然支持C++17的情况下,只有原始指针被视为连续迭代器。

兼容范围

QSpan也可以从一个兼容的范围构造。如果一个范围具有兼容的迭代器,那么它是兼容的。

另外请参阅QListQStringViewQLatin1StringViewQUtf8StringView

成员类型文档

[别名] QSpan::const_iterator

const T*const_pointer的别名。

另外请参阅const_pointeriteratorconst_reverse_iterator

[别名] QSpan::const_pointer

const T*const element_type*的别名。

此别名是为了与STL保持兼容性而提供的。

另外请参阅element_typepointerconst_referenceconst_iterator

[别名] QSpan::const_reference

const T&const element_type&的别名。

此别名是为了与STL保持兼容性而提供的。

另外请参阅element_typereferenceconst_pointer

[别名] QSpan::const_reverse_iterator

std::reverse_iterator<const_iterator>的别名。

另外请参阅const_iteratorreverse_iterator

[别名] QSpan::difference_type

是qptrdiff的别名。这与std::span不同。

此别名是为了与STL保持兼容性而提供的。

[别名] QSpan::element_type

T的别名。包括任何const修饰符。

此别名是为了与STL保持兼容性而提供的。

另外请参阅value_typepointer

[别名] QSpan::iterator

T*pointer的别名。包括任何const修饰符。

另请参阅 指针常量迭代器逆迭代器

[别称] QSpan::pointer

分别为T*element_type*的别称。如果适用,包括const

此别名是为了与STL保持兼容性而提供的。

另请参阅 元素类型常量指针引用迭代器

[别称] QSpan::reference

分别为T&element_type&的别称。如果适用,包括const

此别名是为了与STL保持兼容性而提供的。

另请参阅 元素类型常量引用指针

[别称] QSpan::reverse_iterator

std::reverse_iterator<iterator>的别称。如果适用,包括const

另请参阅 迭代器常量逆迭代器

[别称] QSpan::size_type

是qsizetype的别名。这与std::span不同

此别名是为了与STL保持兼容性而提供的。

[别称] QSpan::value_type

是指T的别名。不包括const

此别名是为了与STL保持兼容性而提供的。

另请参阅 元素类型

成员函数文档

[默认] QSpan::QSpan(QSpan<T, E> &&other)

[默认] QSpan::QSpan(const QSpan<T, E> &other)

[默认] QSpan<T, E> &QSpan::operator=(QSpan<T, E> &&other)

[默认] QSpan<T, E> &QSpan::operator=(const QSpan<T, E> &other)

[默认] QSpan::~QSpan()

这些特殊成员函数是隐式定义的。

注意: 移动等价于复制。仅从区间到区间的数据会被复制,而不是引用的数据。

[constexpr noexcept] 模板 <typename S, size_t N, QSpan<T, E>::if_qualification_conversion = true> QSpan::QSpan(const std::array<S, N> &arr)

[constexpr noexcept] 模板 <size_t N> QSpan::QSpan(q20::type_identity_t<T> (&)[N] arr)

[constexpr noexcept] 模板 <typename S, size_t N, QSpan<T, E>::if_qualification_conversion = true> QSpan::QSpan(std::array<S, N> &arr)

构建一个引用所提供数组的数据 QSpan 的实例 arr

注意:此构造函数仅在以下条件之一满足时才参与重载解析

  • either N大小std::dynamic_extent 或其他地,大小 == N
  • 并且 either Sconst ST 相同。

注意:q20::type_identity_t 是 C++17 对 C++20 的 std::type_identity_t 的向后兼容。

[constexpr noexcept] 模板 <typename S, size_t N, QSpan<T, E>::if_qualification_conversion = true> QSpan::QSpan(QSpan<S, N> other)

[constexpr noexcept] 模板 <typename S, size_t N, QSpan<T, E>::if_qualification_conversion = true> QSpan::QSpan(std::span<S, N> other)

构建一个引用所提供范围 other 的数据的 QSpan

注意:此构造函数仅在以下条件之一满足时才参与重载解析

  • either N大小std::dynamic_extent大小 == N
  • 并且 either Sconst ST 相同。

[constexpr] bool QSpan::empty() const

[noexcept] bool QSpan::isEmpty() const

返回跨度是否为空,即 size() == 0

这些函数执行相同的功能:empty() 提供了 STL 兼容性,而 isEmpty() 提供了 Qt 兼容性。

另请参阅:size() 和 size_bytes()。

[constexpr] QSpan<T> QSpan::sliced(QSpan<T, E>::size_type pos) const

[constexpr] QSpan<T> QSpan::subspan(QSpan<T, E>::size_type pos) const

返回一个大小为 size() - pos 的可变大小跨度,引用从跳过前 pos 个元素后的此跨度的剩余部分。

pos 必须是非负的。

此跨度的元素数必须至少是 pos 个 (E >= possize() >= pos),否则行为是未定义的。

这些函数执行相同的功能:subspan() 提供了 STL 兼容性,而 sliced() 提供了 Qt 兼容性。

另请参阅:subspan(),first(QSpan<T,E>::size_type) 和 last(QSpan<T,E>::size_type)。

[constexpr] QSpan<T> QSpan::sliced(QSpan<T, E>::size_type pos, QSpan<T, E>::size_type n) const

[constexpr] QSpan<T> QSpan::subspan(QSpan<T, E>::size_type pos, QSpan<T, E>::size_type n) const

返回一个大小为 n 的可变大小 span,引用从 pos 开始的此 span 的 n 个元素。

posn 必须是非负数。

此 span 必须至少持有 pos + n 个元素(E >= pos + nsize() >= pos + n),否则行为是未定义的。

这些函数执行相同的功能:subspan() 提供了 STL 兼容性,而 sliced() 提供了 Qt 兼容性。

另请参阅:subspan(),first(QSpan<T,E>::size_type) 和 last(QSpan<T,E>::size_type)。

[constexpr] 模板 <= true> QSpan::QSpan(It first, qsizetype count)

构造一个引用从 first 开始且长度为 count 的 QSpan。

[first, count) 必须是一个有效的范围。

注意: 仅当 It可兼容的迭代器 时,此构造函数才参与重载解析。

[constexpr] 模板 <= true> QSpan::QSpan(It first, It last)

构造一个 QSpan,引用从 first 开始,长度为(last - first)。

[first, last) 必须是一个有效的范围。

注意: 仅当 It可兼容的迭代器 时,此构造函数才参与重载解析。

[constexpr] 模板 <typename Range, QSpan<T, E>::if_compatible_range= true> QSpan::QSpan(Range &&r)

构造一个 QSpan,引用提供的范围 r 中的数据。

注意: 仅当 Range可兼容的范围 时,此构造函数才参与重载解析。

[constexpr] QSpan::QSpan(std::initializer_list<QSpan<T, E>::value_type> il)

构造一个 QSpan,引用提供初始化列表 il 中的数据。

注意: 仅当 Tconst-qualified 时,此构造函数才参与重载解析。

注意: 仅当 Estd::dynamic_extent 时,此构造函数是 noexcept 的。

注意: 如果 E 不是 std::dynamic_extentil 的大小不是 E,则行为是未定义的。

[default] QSpan::QSpan()

默认构造函数。

仅当 E 是零(0)或 std::dynamic_extent 时,此构造函数才存在。换句话说:只有固定零大小或可变大小的 span 才可以默认构造。

另请参阅: 范围

[constexpr] QSpan<T, E>::reference QSpan::back() const

返回span中最后一个元素的引用。

span不能为空,否则行为是未定义的。

另请参阅operator[](),front(),size()和empty()。

[constexpr noexcept] QSpan<T, E>::iterator QSpan::begin() const

返回指向span开头的迭代器。

由于QSpan迭代器只是指针,这和调用data()是一样的。

另请参阅end(),cbegin(),rbegin(),crbegin()和data()。

[constexpr noexcept] QSpan<T, E>::const_iterator QSpan::cbegin() const

返回指向span开头的const_iterator。

这将返回一个只读迭代器,即使T不是const。

QSpan<int> span = ~~~;
*span.begin() = 42; // OK
*span.cbegin() = 42; // ERROR: cannot assign through a const_iterator

另请参阅cend(),begin(),crbegin(),rbegin()和data()。

[constexpr noexcept] QSpan<T, E>::const_iterator QSpan::cend() const

返回指向span末尾之后的const_iterator。

另请参阅cbegin(),end(),crend(),rend(),data()和size()。

[constexpr noexcept] QSpan<T, E>::const_reverse_iterator QSpan::crbegin() const

返回指向反转span开头的const_reverse_iterator。

另请参阅crend(),rbegin(),cbegin()和begin()。

[constexpr noexcept] QSpan<T, E>::const_reverse_iterator QSpan::crend() const

返回指向反转span末尾之后的const_reverse_iterator。

另请参阅crbegin(),rend(),cend()和end()。

[constexpr noexcept] QSpan<T, E>::pointer QSpan::data() const

返回span起始位置的指针。

等同于调用 begin()。

另请参阅 begin() 和 front()。

[constexpr noexcept] QSpan<T, E>::iterator QSpan::end() const

返回一个指向span末尾之后的迭代器。

由于 QSpan 迭代器只是指针,因此此操作等同于调用 data() + size()

另请参阅 begin(),cend(),rend(),crend(),data() 和 size()。

[constexpr noexcept(...)] template <std::size_t Count> QSpan<T, Count> QSpan::first() const

返回一个固定大小的span,大小为 Count,引用 *this 的前 Count 个元素。

span必须包含至少 Count 个元素(E >= Count size() >= Count),否则行为未定义。

注意: 当 "subspan_always_succeeds_v" 为真时,此函数不会抛出任何异常。

另请参阅 first(QSpan<T,E>::size_type),last() 和 subspan()。

[constexpr] QSpan<T> QSpan::first(QSpan<T, E>::size_type n) const

返回一个大小为 n 的可变大小span,引用 *this 的前 n 个元素。

n 必须是非负数。

span必须包含至少 n 个元素(E >= n size() >= n),否则行为未定义。

另请参阅 first<N>(),last(QSpan<T,E>::size_type),subspan(QSpan<T,E>::size_type),subspan(QSpan<T,E>::size_type, QSpan<T,E>::size_type) 和 sliced()。

[constexpr] QSpan<T, E>::reference QSpan::front() const

返回对span中第一个元素的引用。

span不能为空,否则行为是未定义的。

另请参阅 operator[](),back(),size() 和 empty()。

[constexpr noexcept(...)] template <std::size_t Count> QSpan<T, Count> QSpan::last() const

返回一个大小为 Count 的区间,引用自 * 的最后 Count 个元素。

span必须包含至少 Count 个元素(E >= Count size() >= Count),否则行为未定义。

注意: 当 "subspan_always_succeeds_v" 为真时,此函数不会抛出任何异常。

另请参阅 last(QSpan<T,E>::size_type), first(), 和 subspan().

[constexpr] QSpan<T> QSpan::last(QSpan<T, E>::size_type n) const

返回一个大小为 n 的区间,引用自 * 的最后 n 个元素。

n 必须是非负数。

span必须包含至少 n 个元素(E >= n size() >= n),否则行为未定义。

另请参阅 last(), first(QSpan<T,E>::size_type), subspan(QSpan<T,E>::size_type), subspan(QSpan<T,E>::size_type, QSpan<T,E>::size_type), 和 sliced().

[constexpr noexcept] QSpan<T, E>::reverse_iterator QSpan::rbegin() const

返回一个指向反转区间开始的 reverse_iterator

另请参阅 rend(), crbegin(), begin(), 和 cbegin().

[constexpr noexcept] QSpan<T, E>::reverse_iterator QSpan::rend() const

返回一个指向反转区间结束之后位置的 reverse_iterator

另请参阅 rbegin(), crend(), end(), 和 cend().

[constexpr noexcept] QSpan<T, E>::size_type QSpan::size() const

返回该区间的大小,即所引用的元素数量。

另请参阅 size_bytes(), empty(), 和 isEmpty().

[constexpr noexcept] QSpan<T, E>::size_type QSpan::size_bytes() const

返回区间在字节中的大小,即元素数量乘以 sizeof(T)

另请参阅 size(), empty(), 和 isEmpty().

[constexpr noexcept(...)] template <std::size_t Offset> auto QSpan::subspan() const

返回一个大小为 E - Offset 的区间,引用自该区间去掉前面的 Offset 个元素之后的剩余部分。

如果 * 是一个可变大小的区间,则返回类型为可变大小的区间,否则为固定大小的区间。

此区间必须保留至少 Offset 个元素(E >= Offset size() >= Offset),否则行为未定义。

注意: 当 "subspan_always_succeeds_v" 为真时,此函数不会抛出任何异常。

另请参阅 subspan(QSpan::size_type), subspan(), first() 和 last().

[constexpr noexcept(...)] 模板 <std::size_t Offset, std::size_t Count> auto QSpan::subspan() const

返回一个大小为 Count 的 span,引用从 Offset 开始的此 span 的 Count 个元素。

如果 * 是一个可变大小的区间,则返回类型为可变大小的区间,否则为固定大小的区间。

此 span 必须至少持有 Offset + Count 个元素(E >= Offset + Countsize() >= Offset + Count),否则行为是未定义的。

注意:当 "subspan_always_succeeds_v" 为真时,此函数不会抛出任何异常。

另请参阅 subspan(QSpan::size_type, QSpan::size_type), subspan(), first() 和 last().

[constexpr] QSpan<T, E>::reference QSpan::operator[](QSpan<T, E>::size_type idx) const

返回到 span 中的索引 idx 的元素的引用。

索引必须在范围内,即 idx >= 0 且 idx < size(),否则行为是未定义的。

另请参阅 front(),back(),size() 和 empty().

成员变量文档

const std::size_t QSpan::extent

QSpan 的第二个模板参数,即 E。对于变长 span,它是 std::dynamic_extent

注意:尽管 QSpan 中的所有其他大小和索引都使用 qsizetype,但此变量(如 E)实际上是类型 size_t,以兼容 std::spanstd::dynamic_extent

另请参阅 size().

© 2024 Qt 公司。在此处包含的文档贡献是各自所有者的版权。提供的文档根据自由软件基金会发布和版权的 GNU 自由文档许可证版本 1.3 的条款进行许可。Qt 和相应的标志是芬兰的 Qt 公司及其在世界各地其他国家的商标。所有其他商标是各自所有者的财产。