QSpan Class

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

连续数据上的非所有者容器。更多

头文件: #include <QSpan>
CMake: find_package(Qt6 REQUIRED COMPONENTS Core)
target_link_libraries(mytarget PRIVATE Qt6::Core)
qmake: QT += core
Qt 6.7

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

公共类型

公共函数

QSpan()
QSpan(QSpan<S, N> other)
QSpan(Range &&r)
QSpan(const std::array<S, N> &arr)
QSpan(q20::type_identity_t<T> (&)[N] arr)
QSpan(std::array<S, N> &arr)
QSpan(std::initializer_list<QSpan<T, E>::value_type> il)
QSpan(std::span<S, N> other)
QSpan(It first, It last)
QSpan(It first, qsizetype count)
QSpan(const QSpan<T, E> &other)
QSpan(QSpan<T, E> &&other)
~QSpan()
auto back() const
auto begin() const
auto cbegin() const
auto cend() const
(since 6.9) void chop(QSpan<T, E>::size_type n)
(since 6.9) auto chopped(QSpan<T, E>::size_type n) const
auto crbegin() const
auto crend() const
auto data() const
auto empty() const
auto end() const
auto first() const
auto first(QSpan<T, E>::size_type n) const
auto front() const
auto isEmpty() const
auto last() const
auto last(QSpan<T, E>::size_type n) const
auto rbegin() const
auto rend() const
auto size() const
auto size_bytes() const
(since 6.9) void slice(QSpan<T, E>::size_type pos)
(since 6.9) void slice(QSpan<T, E>::size_type pos, QSpan<T, E>::size_type n)
auto sliced(QSpan<T, E>::size_type pos) const
auto sliced(QSpan<T, E>::size_type pos, QSpan<T, E>::size_type n) const
auto subspan() const
auto subspan() const
auto subspan(QSpan<T, E>::size_type pos) const
auto subspan(QSpan<T, E>::size_type pos, QSpan<T, E>::size_type n) const
QSpan<T, E> &operator=(QSpan<T, E> &&other)
QSpan<T, E> &operator=(const QSpan<T, E> &other)
QSpan<T, E>::reference operator[](QSpan<T, E>::size_type idx) const

静态公共成员

const std::size_t extent
(since 6.8) auto as_bytes(QSpan<T, E> s)
(since 6.8) auto as_writable_bytes(QSpan<T, E> s)

详细说明

QSpan 引用另一个连续容器的连续部分。它是所有类型的连续容器的接口类型,无需先构造一个拥有容器(如QList 或 std::vector)。

QSpan 引用的数据可表示为数组(或数组兼容的数据结构,如QList 、std::vector、QVarLengthArray 等)。QSpan 本身只是存储一个指向数据的指针,因此用户必须确保 QSpan 对象的寿命不会超过其引用数据的寿命。

QStringViewQLatin1StringViewQUtf8StringView 等视图不同,引用的数据可以通过 QSpan 对象进行修改。为防止出现这种情况,请在const T 上构造一个 QSpan(请参阅Const and Mutable Spans ):

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 版本中可用)即可形成可变大小的跨度。

固定大小的跨度是通过传递一个数字作为第二个模板参数来形成的:

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

顾名思义,固定大小跨度的size() 在编译时是固定的,而可变大小跨度的size() 只有在运行时才能确定。

固定大小的跨度不能默认构造(除非其extent 为零(0))。可变大小的跨度可默认构造的,并且会有data() == nullptrsize() == 0

固定大小的跨度可以隐式转换为可变大小的跨度。相反方向(变长为定长)的前提条件是两个跨度的大小必须匹配。

常量跨度和可变跨度

const与拥有容器不同,const 在 QSpan 中是浅层的:您仍然可以通过常量 QSpan 来修改数据(但不能通过QSpan<const T> ),而且begin() 和end() 在const/non-05 上没有重载。不过,有一些cbegin() 和cend() 返回 const_iterators,即使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 应按值传递,而不是按引用到常量传递:

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 与size_type 一样使用带符号的 qsizetype,而std::span 则使用size_t
  • (自 Qt 6.9 起)QSpan<const T> 不会分离 Qt 容器,而std::span 会。
  • 所有 QSpan 构造函数都是隐式的;许多std::span 构造函数都是explicit
  • QSpan 可以从拥有 rvalue 的容器中构造,而std::span 不能。

当使用所有者容器的函数被转换为使用 QSpan 时,为了源代码兼容性,后两个构造函数是必需的,这在 Qt 中是一个非常重要的用例。使用 qsizetype 是为了与其他 Qt 容器保持一致。QSpan 模板参数仍使用 size_t,以避免引入不必要的错误条件(负大小)。

兼容的迭代器

QSpan 可以通过迭代器和大小或迭代器对来构造,前提是迭代器是兼容的。最终,这应该意味着 C++20std::contiguous_iteratorstd::sentinel_for ,但在 Qt XML 仍然支持 C++17 时,只有原始指针才被视为连续的迭代器。

兼容范围

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

另请参阅 QList,QStringView,QLatin1StringView, 和QUtf8StringView

成员类型文档

[alias] QSpan::const_iterator

分别是const T*const_pointer 的别名。

另请参见 const_pointer,iterator,const_reverse_iteratorConst and Mutable Spans

[alias] QSpan::const_pointer

分别是const T*const element_type* 的别名。

提供该别名是为了与 STL 兼容。

另请参见 element_type,pointer,const_reference,const_iteratorConst and Mutable Spans

[alias] QSpan::const_reference

分别是const T&const element_type& 的别名。

提供该别名是为了与 STL 兼容。

另请参见 element_type,reference,const_pointer, 和Const and Mutable Spans

[alias] QSpan::const_reverse_iterator

std::reverse_iterator<const_iterator> 的别名。

另请参见 const_iterator,reverse_iterator, 和Const and Mutable Spans

[alias] QSpan::difference_type

qptrdiff 的别名。这个 differs from std::span.

这个别名是为了与 STL 兼容。

[alias] QSpan::element_type

T 的别名。包括const ,如果有的话。

提供该别名是为了与 STL 兼容。

另请参见 value_type,pointer, 和Const and Mutable Spans

[alias] QSpan::iterator

分别是T*pointer 的别名。包括const ,如果有的话。

另请参阅 pointer,const_iterator,reverse_iterator, 和Const and Mutable Spans

[alias] QSpan::pointer

分别是T*element_type* 的别名。包括const ,如果有的话。

提供此别名是为了与 STL 兼容。

另请参见 element_type,const_pointer,reference,iteratorConst and Mutable Spans

[alias] QSpan::reference

分别是T&element_type& 的别名。包括const ,如果有的话。

提供此别名是为了与 STL 兼容。

另请参见 element_type,const_reference,pointer, 和Const and Mutable Spans

[alias] QSpan::reverse_iterator

std::reverse_iterator<iterator> 的别名。包括const ,如果有的话。

另请参阅 iterator,const_reverse_iterator, 和Const and Mutable Spans

[alias] QSpan::size_type

qsizetype 的别名。这个 differs from std::span.

提供这个别名是为了与 STL 兼容。

[alias] QSpan::value_type

T 的别名。不包括const ,如果有的话。

提供此别名是为了与 STL 兼容。

另请参见 element_typeConst and Mutable Spans

成员函数文档

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

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

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

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

[default] QSpan::~QSpan()

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

注: 移动等同于复制。只有data() 和size() 从跨度复制到跨度,而不是引用数据。

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

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

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

构造一个QSpan ,引用所提供数组arr 中的数据。

注: q20::type_identity_t 是 C++20 的 std::type_identity_t.

限制条件

只有当

  • Nextentstd::dynamic_extent ,否则extent == N
  • Sconst ST 相同。

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

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

构造一个QSpan ,引用所提供 spanother 中的数据。

限制条件

只有当

  • Nextentstd::dynamic_extentextent == N
  • Sconst ST 相同时,才会参与重载解析。

[constexpr noexcept] auto QSpan::empty() const

[constexpr noexcept] auto QSpan::isEmpty() const

返回 span 是否为空,即size() == 0 是否为空。

这些函数做同样的事情:提供empty() 是为了与 STL 兼容,提供isEmpty() 是为了与 Qt XML 兼容。

另请参见 size() 和size_bytes()。

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

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

返回variable-sized span,大小为size() - pos ,引用去掉第一个pos 元素后此 span 的剩余部分。

pos 必须是非负数。

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

这些函数的作用相同:subspan() 是为了与 STL 兼容,而sliced() 是为了与 Qt XML 兼容。

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

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

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

返回大小为variable-sized 的跨度n ,从pos 开始引用该跨度的n 元素。

posn 都必须是非负数。

该跨度必须至少包含pos + n 元素(E >=pos + n size() >=pos + n ),否则其行为未定义。

这些函数的作用相同:subspan() 是为了与 STL 兼容,而sliced() 是为了与 Qt XML 兼容。

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

[default] QSpan::QSpan()

默认构造函数。

只有当E 为 0 (0) 或std::dynamic_extent 时,才会出现该构造函数。换句话说:只有固定零大小或可变大小的跨度才可使用默认构造函数。

另请参见 extentVariable-Size and Fixed-Size Spans

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

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

限制条件

仅当Rangea compatible range 时才参与重载解析。

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

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

注意: 只有当Estd::dynamic_extent 时,该构造函数才是noexcept

注: 如果E 不是std::dynamic_extent ,且il 的大小不是E ,则行为未定义。

限制条件

只有当Tconst 合格时,才参与重载解析。

另请参阅 Const and Mutable Spans

[constexpr] template <typename It, QSpan<T, E>::if_compatible_iterator<It> = true> QSpan::QSpan(It first, It last)

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

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

限制条件

只有当Ita compatible iterator 时,才参与重载解析。

[constexpr] template <typename It, QSpan<T, E>::if_compatible_iterator<It> = true> QSpan::QSpan(It first, qsizetype count)

构造一个 QSpan,引用从first 开始、长度为count 的数据。

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

限制条件

只有当Ita compatible iterator 时,才参与重载解析。

[constexpr] auto QSpan::back() const

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

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

另请参阅 operator[](),front(),size(),empty() 和Const and Mutable Spans

[constexpr noexcept] auto QSpan::begin() const

返回一个指向跨度起点的迭代器。

由于QSpan 的迭代器只是指针,这与调用data() 相同。

另请参阅 end(),cbegin(),rbegin(),crbegin(),data() 和Const and Mutable Spans

[constexpr noexcept] auto QSpan::cbegin() const

返回指向跨距起点的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() 和Const and Mutable Spans

[constexpr noexcept] auto QSpan::cend() const

返回一个const_iterator ,指向跨度结束后的一端。

另请参阅 cbegin(),end(),crend(),rend(),data(),size() 和Const and Mutable Spans

[constexpr, since 6.9] void QSpan::chop(QSpan<T, E>::size_type n)

*this = chopped(n ) 相同。

此函数仅适用于variable-sized spans

此函数在 Qt 6.9 中引入。

另请参阅 chopped() 。

[constexpr, since 6.9] auto QSpan::chopped(QSpan<T, E>::size_type n) const

返回大小为variable-sized 的跨距size() -n ,引用此跨距的第一个size() -n 元素。

first(size() - n) 相同。

n 必须为非负。

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

此函数在 Qt 6.9 中引入。

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

[constexpr noexcept] auto QSpan::crbegin() const

返回指向反转跨距起点的const_reverse_iterator

另请参阅 crend(),rbegin(),cbegin(),begin() 和Const and Mutable Spans

[constexpr noexcept] auto QSpan::crend() const

返回一个const_reverse_iterator ,指向反转跨度的末端。

另请参阅 crbegin(),rend(),cend(),end() 和Const and Mutable Spans

[constexpr noexcept] auto QSpan::data() const

返回指向跨距起点的指针。

与调用begin() 相同。

另请参阅 begin(),front() 和Const and Mutable Spans

[constexpr noexcept] auto QSpan::end() const

返回一个迭代器,该迭代器指向跨度末端的一个位置。

由于QSpan 的迭代器只是指针,这与调用data() + size() 相同。

另请参阅 begin(),cend(),rend(),crend(),data(),size() 和Const and Mutable Spans

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

返回fixed-sized span,大小为Count ,引用*this 的第一个Count 元素。

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

注意: subspan_always_succeeds_v<Count>true 时,此函数为 noexcept。

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

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

返回variable-sized span,大小为n ,引用*this 的第一个n 元素。

n 必须为非负。

跨度必须至少包含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(), 和chopped().

[constexpr] auto QSpan::front() const

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

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

另请参阅 operator[](),back(),size(),empty() 和Const and Mutable Spans

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

返回fixed-sized span,大小为Count ,引用*this 的最后Count 元素。

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

注意: subspan_always_succeeds_v<Count>true 时,此函数为 noexcept。

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

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

返回variable-sized span,大小为n ,引用*this 的最后n 元素。

n 必须为非负。

跨度必须至少包含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(), 和chopped().

[constexpr noexcept] auto QSpan::rbegin() const

返回指向反转跨距起点的reverse_iterator

另请参阅 rend(),crbegin(),begin(),cbegin() 和Const and Mutable Spans

[constexpr noexcept] auto QSpan::rend() const

返回一个reverse_iterator ,指向反转跨度的末端。

另请参阅 rbegin(),crend(),end(),cend() 和Const and Mutable Spans

[constexpr noexcept] auto QSpan::size() const

返回跨度的大小,即引用元素的个数。

另请参见 size_bytes()、empty() 和isEmpty()。

[constexpr noexcept] auto QSpan::size_bytes() const

以字节为单位返回跨度的大小,即元素数乘以sizeof(T)

另请参阅 size()、empty() 和isEmpty()。

[constexpr, since 6.9] void QSpan::slice(QSpan<T, E>::size_type pos)

*this = sliced(pos ) 相同。

此函数仅适用于variable-sized spans

此函数在 Qt 6.9 中引入。

另请参阅 sliced() 。

[constexpr, since 6.9] void QSpan::slice(QSpan<T, E>::size_type pos, QSpan<T, E>::size_type n)

*this = sliced(pos , n ) 相同。

此函数仅在variable-sized spans 上可用。

此函数在 Qt 6.9 中引入。

另请参阅 sliced() 。

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

返回大小为Count 的跨度,引用该跨度中从Offset 开始的Count 元素。

如果*this 是一个大小可变的跨度,则返回类型是一个大小可变的跨度,否则是一个大小固定的跨度。

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

注意: subspan_always_succeeds_v<Offset + Count>true 时,此函数为 noexcept。

另请参阅 subspan(QSpan<T,E>::size_type, QSpan<T,E>::size_type), subspan(),first(),last(), 和Variable-Size and Fixed-Size Spans

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

返回大小为E - Offset 的跨度,引用去掉第一个Offset 元素后此跨度的剩余部分。

如果*this 是大小可变的跨度,则返回类型为大小可变的跨度,否则返回类型为固定大小的跨度。

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

注意: subspan_always_succeeds_v<Offset>true 时,此函数为 noexcept。

另请参阅 subspan(QSpan<T,E>::size_type),subspan(),first(),last(), 和Variable-Size and Fixed-Size Spans

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

返回对跨中索引idx 处元素的引用。

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

另请参阅 front(),back(),size(),empty() 和Const and Mutable Spans

成员变量文档

const std::size_t QSpan::extent

QSpan<T, E> 的第二个模板参数,即E 。这是std::dynamic_extent ,用于variable-sized spans

注意: 虽然QSpan 中的所有其他大小和索引都使用 qsizetype,但为了与std::spanstd::dynamic_extent 兼容,该变量与E 一样,实际上是size_t 类型。

另请参阅 size()。

相关非会员

[noexcept, since 6.8] auto as_bytes(QSpan<T, E> s)

s 作为其size() 等于s.size_bytes()QSpan<const std::byte, E'> 返回。

如果Estd::dynamic_extent ,那么E' 也是 。否则,返回E' = E * sizeof(T)

注: q20::dynamic_extent 是 C++20 的 C++17 后向移植。 std::dynamic_extent.

该函数在 Qt 6.8 中引入。

另请参阅 as_writable_bytes(),size_bytes() 和Const and Mutable Spans

[noexcept, since 6.8] auto as_writable_bytes(QSpan<T, E> s)

s 作为其size() 等于s.size_bytes()QSpan<std::byte, E'> 返回。

如果Estd::dynamic_extent ,那么E' 也是 。否则,返回E' = E * sizeof(T)

注: q20::dynamic_extent 是 C++20 的 C++17 后向移植。 std::dynamic_extent.

限制条件

仅当!std::is_const_v<T> 时才参与重载解析。

该函数在 Qt 6.8 中引入。

另请参阅 as_bytes(),size_bytes() 和Const and Mutable Spans

© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.