QSpan 类
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 | 
注意:此类中的所有函数都是重入的。
公共类型
| const_iterator | |
| const_pointer | |
| const_reference | |
| const_reverse_iterator | |
| difference_type | |
| element_type | |
| iterator | |
| pointer | |
| reference | |
| reverse_iterator | |
| size_type | |
| value_type | 
公共函数
| 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>::reference | back() const | 
| QSpan<T, E>::iterator | begin() const | 
| QSpan<T, E>::const_iterator | cbegin() const | 
| QSpan<T, E>::const_iterator | cend() const | 
| QSpan<T, E>::const_reverse_iterator | crbegin() const | 
| QSpan<T, E>::const_reverse_iterator | crend() const | 
| QSpan<T, E>::pointer | data() const | 
| bool | empty() const | 
| QSpan<T, E>::iterator | end() const | 
| QSpan<T, Count> | first() const | 
| QSpan<T> | first(QSpan<T, E>::size_type n) const | 
| QSpan<T, E>::reference | front() const | 
| bool | isEmpty() const | 
| QSpan<T, Count> | last() const | 
| QSpan<T> | last(QSpan<T, E>::size_type n) const | 
| QSpan<T, E>::reverse_iterator | rbegin() const | 
| QSpan<T, E>::reverse_iterator | rend() const | 
| QSpan<T, E>::size_type | size() const | 
| QSpan<T, E>::size_type | size_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 | 
| auto | subspan() const | 
| auto | subspan() 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>::reference | operator[](QSpan<T, E>类型::size_type idx) const | 
静态公共成员
| const std::size_t | 范围 | 
详细描述
QSpan引用另一个连续容器的连续部分。它为所有类型的连续容器提供了一个接口类型,无需先构造拥有容器的对象,例如QList或std::vector。
QSpan引用的数据可以表示为一个数组(或与数组兼容的数据结构,如QList,std::vector,QVarLengthArray等)。QSpan本身仅存储数据指针,因此用户必须确保QSpan对象不会超出它们引用的数据的范围。
与QStringView,QLatin1StringView和QUtf8StringView这样的视图不同,可以通过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
正如其名所示,固定大小span的size()在编译时是固定的,而可变大小span的size()仅在运行时确定。
固定大小span不可默认构造(除非其范围为零(0))。可变大小span是可默认构造的,并将具有data() == nullptr和size() == 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_iterator和std::sentinel_for,但在Qt仍然支持C++17的情况下,只有原始指针被视为连续迭代器。
兼容范围
QSpan也可以从一个兼容的范围构造。如果一个范围具有
另外请参阅QList、QStringView、QLatin1StringView和QUtf8StringView。
成员类型文档
[别名] QSpan::const_iterator
是const T*和const_pointer的别名。
另外请参阅const_pointer、iterator和const_reverse_iterator。
[别名] QSpan::const_pointer
是const T*和const element_type*的别名。
此别名是为了与STL保持兼容性而提供的。
另外请参阅element_type、pointer、const_reference和const_iterator。
[别名] QSpan::const_reference
是const T&和const element_type&的别名。
此别名是为了与STL保持兼容性而提供的。
另外请参阅element_type、reference和const_pointer。
[别名] QSpan::const_reverse_iterator
是std::reverse_iterator<const_iterator>的别名。
另外请参阅const_iterator和reverse_iterator。
[别名] QSpan::difference_type
是qptrdiff的别名。这与std::span不同。
此别名是为了与STL保持兼容性而提供的。
[别名] QSpan::element_type
是T的别名。包括任何const修饰符。
此别名是为了与STL保持兼容性而提供的。
另外请参阅value_type和pointer。
[别名] 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。
注意:此构造函数仅在以下条件之一满足时才参与重载解析
注意: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。
注意:此构造函数仅在以下条件之一满足时才参与重载解析
返回跨度是否为空,即 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 >= pos 且 size() >= 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 个元素。
pos 和 n 必须是非负数。
此 span 必须至少持有 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)。
[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 中的数据。
注意: 仅当 T 是 const-qualified 时,此构造函数才参与重载解析。
注意: 仅当 E 是 std::dynamic_extent 时,此构造函数是 noexcept 的。
注意: 如果 E 不是 std::dynamic_extent 且 il 的大小不是 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()。
[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
[constexpr noexcept(...)] 模板 <std::size_t Offset, std::size_t Count> auto QSpan::subspan() const
返回一个大小为 Count 的 span,引用从 Offset 开始的此 span 的 Count 个元素。
如果 * 是一个可变大小的区间,则返回类型为可变大小的区间,否则为固定大小的区间。
此 span 必须至少持有 Offset + Count 个元素(E >= Offset + Count 且 size() >= Offset + Count),否则行为是未定义的。
注意:当 "subspan_always_succeeds_v
另请参阅 subspan(QSpan
[constexpr] QSpan<T, E>::reference QSpan::operator[](QSpan<T, E>::size_type idx) const
返回到 span 中的索引 idx 的元素的引用。
索引必须在范围内,即 idx >= 0 且 idx < size(),否则行为是未定义的。
© 2024 Qt 公司。在此处包含的文档贡献是各自所有者的版权。提供的文档根据自由软件基金会发布和版权的 GNU 自由文档许可证版本 1.3 的条款进行许可。Qt 和相应的标志是芬兰的 Qt 公司及其在世界各地其他国家的商标。所有其他商标是各自所有者的财产。