QSpan Class
template <typename T, std::size_t E> class QSpan一个不拥有连续数据的容器。更多内容...
| 标题: | #include <QSpan> |
| CMake: | find_package(Qt6 REQUIRED COMPONENTS Core) target_link_libraries(mytarget PRIVATE Qt6::Core) |
| qmake: | QT += core |
| 自: | Qt 6.7 |
注:本类中的所有函数均为可重入函数。
公共类型
| const_iterator | |
| const_pointer | |
| const_reference | |
| const_reverse_iterator | |
| difference_type | |
| element_type | |
| iterator | |
| pointer | |
| reference | |
| reverse_iterator | |
| size_type | |
| value_type |
公共函数
| QSpan() | |
| QSpan(QSpan<S, N> other) | |
| QSpan(Range &&r) | |
| QSpan(const std::array<S, N> &arr) | |
| QSpan(q20::type_identity_t<T> (&arr)[N]) | |
| 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<T, E> 是一个模板类,其中T 是元素类型,E 是范围(元素个数,对于可变大小的跨度,则为std::dynamic_extent )。
QSpan 引用了另一个连续容器的连续部分。它作为各类连续容器的接口类型,无需先构建QList 或 std::vector 等拥有容器。
QSpan 引用的数据可以表示为数组(或与数组兼容的数据结构,如QList 、std::vector、QVarLengthArray 等)。QSpan 本身仅存储指向该数据的指针,因此用户必须确保 QSpan 对象的存活时间不会超过其所引用的数据。
与QStringView 、QLatin1StringView 和QUtf8StringView 等视图不同,可以通过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 构建中可用),即可形成可变大小的跨度。
固定大小的 span 是通过将一个数字作为第二个模板参数传递而形成的:
顾名思义,固定大小的span的size()在编译时即已确定,而可变大小的span的size()则仅在运行时确定。
固定大小的跨度无法通过默认构造函数构造(除非其extent 为零 (0))。可变大小的跨度可以通过默认构造函数构造,且其data() == nullptr 和size() == 0 。
固定大小的跨度可以隐式转换为可变大小的跨度。反向转换(即从可变长度转换为固定长度)的前提是两个跨度的大小必须一致。
常量和可变跨度
与拥有型容器不同,在 QSpan 中 `const ` 是浅拷贝:你仍然可以通过 const QSpan 修改数据(但不能通过 `QSpan<const T>`),并且 `begin()` 和 `end()` 在 `const` / `non-const` 上未被重载。不过,存在 `cbegin()` 和 `cend()` 函数,它们返回 const_iterator,即使 `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 efficientQSpan<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 可以从拥有型右值容器构造,而
std::span则不能。
最后两点对于源代码兼容性是必需的,当原本接受拥有型容器的函数被转换为接受 QSpan 时,这在 Qt 中是一个至关重要的用例。使用 qsizetype 是为了与 Qt 中的其他容器保持一致。 QSpan 模板参数仍使用 size_t,以避免引入不必要的错误情况(负大小)。
兼容的迭代器
QSpan 可以由一个迭代器和大小,或者由一对迭代器构造,前提是这些迭代器是兼容的。最终,这应指 C++20 中的std::contiguous_iterator 和std::sentinel_for ,但在 Qt 仍支持 C++17 的情况下,只有原始指针会被视为连续迭代器。
兼容的范围
QSpan 还可以通过兼容的范围进行构造。如果一个范围满足compatible iterators ,则该范围是兼容的。
另请参阅 QList 、QStringView 、QLatin1StringView 以及QUtf8StringView 。
成员类型文档
[alias] QSpan::const_iterator
分别是const T* 和const_pointer 的别名。
另请参阅 const_pointer 、iterator 、const_reverse_iterator 以及Const and Mutable Spans 。
[alias] QSpan::const_pointer
分别是const T* 和const element_type* 的别名。
提供此别名是为了与 STL 保持兼容。
另请参阅 element_type 、pointer 、const_reference 、const_iterator 以及Const 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 、iterator 以及Const 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_type 和Const and Mutable Spans 。
成员函数文档
[implicit] QSpan::QSpan()
默认构造函数。
只有当E 为零(0)或std::dynamic_extent 时,才存在此构造函数。换言之:只有固定零大小的跨度或可变大小的跨度才可使用默认构造函数进行构造。
另请参阅 extent 和Variable-Size and Fixed-Size Spans 。
[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 中的数据。
约束
仅当
[constexpr] template <typename Range, QSpan<T, E>::if_compatible_range<Range> = true> QSpan::QSpan(Range &&r)
构建一个 QSpan,该对象引用所提供范围r 中的数据。
约束
仅当Range 为a compatible range 时,才参与重载解析。
[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> (&arr)[N])
[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的向后兼容实现。
约束
仅当
[constexpr] QSpan::QSpan(std::initializer_list<QSpan<T, E>::value_type> il)
构建一个引用所提供初始化列表il 中数据的QSpan。
注意: 只有当 `E ` 为 `std::dynamic_extent` 时,此 构造函数才为 `noexcept `。
注意:如果 E 不为std::dynamic_extent ,且il 的大小不为E ,则行为未定义。
约束
仅当T 采用const 限定时,才参与重载解析。
另请参阅 Const and Mutable Spans 。
[constexpr] template <typename It, QSpan<T, E>::if_compatible_iterator<It> = true> QSpan::QSpan(It first, It last)
构建一个引用从first 开始、长度为(last -first)的数据的QSpan。
[first, last) 必须是一个有效的范围。
约束
仅当It 为a compatible iterator 时,才参与重载解析。
[constexpr] template <typename It, QSpan<T, E>::if_compatible_iterator<It> = true> QSpan::QSpan(It first, qsizetype count)
构建一个 QSpan,该 QSpan 引用从first 开始且长度为count 的数据。
[first, count) 必须是一个有效的范围。
约束
仅当It 为a 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
返回一个指向span结尾之后一个位置的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
返回一个大小为size()的variable-sized 范围,其引用范围为n ,对应该范围内的前size()-n 个元素。
与first(size() - n) 相同。
n 必须为非负数。
该 span 必须至少包含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 。
返回该区间是否为空,即size() == 0 。
这两个函数的功能相同:empty() 用于兼容 STL,isEmpty() 用于兼容 Qt。
另请参阅 size() 和size_bytes()。
[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
返回一个大小为Count 的fixed-sized 跨度,该跨度引用*this 中前Count 个元素。
该 span 必须至少包含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
返回一个大小为n 的variable-sized 跨度,该跨度引用了*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() 以及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
返回一个大小为Count 的fixed-sized 跨度,该跨度引用了*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
返回一个大小为n 的variable-sized 跨度,该跨度引用了*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
返回 span 的大小,即它所引用的元素数量。
另请参阅 size_bytes()、empty()、以及isEmpty()。
[constexpr noexcept] auto QSpan::size_bytes() const
返回该span的大小(以字节为单位),即元素数量乘以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] auto QSpan::sliced(QSpan<T, E>::size_type pos) const
[constexpr] auto QSpan::subspan(QSpan<T, E>::size_type pos) const
返回一个大小为size() - pos 的variable-sized 跨度,该跨度引用了在删除前pos 个元素后剩余的部分。
pos 必须为非负数。
该 span 必须至少包含pos 个元素(E >=pos 且 size() >=pos ),否则行为未定义。
这些函数的功能相同:subspan() 用于兼容 STL,而sliced() 用于兼容 Qt。
另请参阅 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
返回一个大小为n 的variable-sized 跨区,该跨区引用了从pos 开始的该跨区中的n 元素。
pos 和n 必须均为非负数。
该跨度必须至少包含pos + n 个元素(E >=pos + n 且 size() >=pos + n ),否则行为未定义。
这些函数功能相同:subspan() 用于兼容 STL,sliced() 用于兼容 Qt。
另请参阅 subspan()、first(QSpan<T,E>::size_type)、last(QSpan<T,E>::size_type)、chopped() 以及slice()。
[constexpr noexcept(...)] template <std::size_t Offset, std::size_t Count> auto QSpan::subspan() const
返回一个大小为Count 的span,该span引用了从Offset 开始的、属于该span的Count 个元素。
如果*this 是可变大小的 span,则返回类型为可变大小的 span;否则,返回类型为固定大小的 span。
该 span 必须至少容纳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)、first()、last() 以及Variable-Size and Fixed-Size Spans 。
[constexpr noexcept(...)] template <std::size_t Offset> auto QSpan::subspan() const
返回一个大小为E - Offset 的span,该span引用了在删除前Offset 个元素后剩余的部分。
如果*this 是可变大小的 span,则返回类型为可变大小的 span;否则,返回类型为固定大小的 span。
该 span 必须至少包含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 。
[implicit] QSpan<T, E> &QSpan::operator=(QSpan<T, E> &&other)
[implicit] QSpan::~QSpan()
[implicit] QSpan<T, E> &QSpan::operator=(const QSpan<T, E> &other)
[implicit] QSpan::QSpan(QSpan<T, E> &&other)
[implicit] QSpan::QSpan(const QSpan<T, E> &other)
这些特殊成员函数是隐式定义的。
[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 and Mutable Spans 。
成员变量文档
const std::size_t QSpan::extent
QSpan<T, E> 的第二个模板参数,即E 。对于variable-sized spans ,该参数为std::dynamic_extent 。
注意:虽然 QSpan 中的所有其他大小和索引都使用 qsizetype,但该变量与E 一样,实际上是size_t 类型,这是为了与std::span 和std::dynamic_extent 保持兼容性。
另请参阅 size()。
相关的非成员
[noexcept, since 6.8] auto as_bytes(QSpan<T, E> s)
返回一个s ,将其表示为QSpan<const std::byte, E'> ,其size()的值为s.size_bytes() 。
E' = E * sizeof(T)如果E 是std::dynamic_extent ,则E' 也是 ;否则, 。
注: q20::dynamic_extent 是 C++20 中 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 的QSpan<std::byte, E'> ,其size() 的值等于s.size_bytes() 。
如果E 是std::dynamic_extent ,则E' 也是 ;否则, 为E' = E * sizeof(T) 。
注: q20::dynamic_extent 是 C++20 中 std::dynamic_extent。
约束
仅当!std::is_const_v<T> 成立时,才参与重载解析。
该函数于 Qt 6.8 中引入。
另请参阅 as_bytes()、size_bytes() 和Const and Mutable Spans 。
© 2026 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.