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 公司及其在世界各地其他国家的商标。所有其他商标是各自所有者的财产。