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
Since: 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> (&)[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
(從 6.9 起) void chop (QSpan<T, E>::size_type n )
(從 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
(從 6.9 起) void slice (QSpan<T, E>::size_type pos )
(從 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
(從 6.8 起) auto as_bytes (QSpan<T, E> s )
(從 6.8 起) auto as_writable_bytes (QSpan<T, E> s )

詳細描述

QSpan 引用另一連續容器的連續部分。它充當所有種類連續容器的接口類型,不需要構造擁有容器,譬如 QList 或 std::vector 優先。

由 QSpan 引用的數據可以錶示成數組 (或兼容數組的數據結構,譬如 QList , std::vector, QVarLengthArray ,等)。QSpan 本身僅僅存儲數據指針,因此用戶必須確保 QSpan 對象不會比它們引用的數據更長壽。

不像視圖,譬如 QStringView , QLatin1StringView and QUtf8StringView , referenced data can be modified through a QSpan object. To prevent this, construct a QSpan over a const T (見 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
				
					

Variable-Size and Fixed-Size Spans

QSpan 可以是 fixed-size or variable-sized .

A variable-sized span is formed by omitting the second template argument (or setting it to std::dynamic_extent , which is, however, only available in C++20 builds), as seen in the example above.

A fixed-size span is formed by passing a number as the second template argument:

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

As the name suggests, a fixed-size span's size () is fixed at compile-time whereas the size () of a variable-sized span is determined only at run-time.

A fixed-size span is not default-constructible (unless its extent is zero (0)). A variable-sized span is default-constructible and will have data() == nullptr and size() == 0 .

A fixed-size span can be implicitly converted into a variable-sized one. The opposite direction (variable-length into fixed-length) has the precondition that both span's sizes must match.

Const and Mutable Spans

不像采用擁有容器, const is shallow in QSpan: you can still modify the data through a const QSpan (but not through a QSpan<const T> ),和 begin () 和 end () are not overloaded on const /non- const . There are cbegin () 和 cend (), though, that return const_iterators which prevent modification of the data even though T is not 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 should be passed by value, not by reference-to-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> 文字類型 , regardless of whether T is a Literal Type or not.

QSpan vs. std::span

QSpan is closely modelled after std::span , but has a few differences which we'll discuss here. Since they both implicitly convert into each other, you're free to choose whichever one you like best in your own code.

  • QSpan is using the signed qsizetype as size_type whereas std::span 使用 size_t .
  • (since Qt 6.9) QSpan<const T> doesn't detach Qt containers, std::span does.
  • All QSpan constructors are implicit; many std::span ones are explicit .
  • QSpan can be constructed from rvalue owning containers, std::span can not.

The last two are required for source-compatibility when functions that took owning containers are converted to take QSpan instead, which is a vitally-important use-case in Qt. The use of qsizetype is for consistency with the rest of Qt containers. QSpan template arguments still use size_t to avoid introducing unnecessary error conditions (negative sizes).

兼容迭代器

QSpan can be constructed from an iterator and size or from an iterator pair, provided the iterators are compatible ones. Eventually, this should mean C++20 std::contiguous_iterator and std::sentinel_for , but while Qt still supports C++17, only raw pointers are considered contiguous iterators.

兼容範圍

QSpan can also be constructed from a compatible range. A range is compatible if it has compatible iterators .

另請參閱 QList , QStringView , QLatin1StringView ,和 QUtf8StringView .

成員類型文檔編製

[alias] QSpan:: const_iterator

彆名化的 const T* and const_pointer ,分彆。

另請參閱 const_pointer , iterator , const_reverse_iterator ,和 Const and Mutable Spans .

[alias] QSpan:: const_pointer

彆名化的 const T* and const element_type* ,分彆。

This alias is provided for compatbility with the STL.

另請參閱 element_type , pointer , const_reference , const_iterator ,和 Const and Mutable Spans .

[alias] QSpan:: const_reference

彆名化的 const T& and const element_type& ,分彆。

This alias is provided for compatbility with the 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

An alias for qptrdiff. This 不同於 std::span .

This alias is provided for compatbility with the STL.

[alias] QSpan:: element_type

彆名化的 T . Includes the const ,若有的話。

This alias is provided for compatbility with the STL.

另請參閱 value_type , pointer ,和 Const and Mutable Spans .

[alias] QSpan:: iterator

彆名化的 T* and pointer , respectively. Includes the const ,若有的話。

另請參閱 pointer , const_iterator , reverse_iterator ,和 Const and Mutable Spans .

[alias] QSpan:: pointer

彆名化的 T* and element_type* , respectively. Includes the const ,若有的話。

This alias is provided for compatbility with the STL.

另請參閱 element_type , const_pointer , reference , iterator ,和 Const and Mutable Spans .

[alias] QSpan:: reference

彆名化的 T& and element_type& , respectively. Includes the const ,若有的話。

This alias is provided for compatbility with the STL.

另請參閱 element_type , const_reference , pointer ,和 Const and Mutable Spans .

[alias] QSpan:: reverse_iterator

彆名化的 std::reverse_iterator<iterator> . Includes the const ,若有的話。

另請參閱 iterator , const_reverse_iterator ,和 Const and Mutable Spans .

[alias] QSpan:: size_type

An alias for qsizetype. This 不同於 std::span .

This alias is provided for compatbility with the STL.

[alias] QSpan:: value_type

彆名化的 T 。排除 const ,若有的話。

This alias is provided for compatbility with the STL.

另請參閱 element_type and Const 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 ()

These Special Member Functions are implicitly-defined.

注意: Moves are equivalent to copies. Only data () 和 size () are copied from span to span, not the referenced data.

[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 referencing the data in the supplied array arr .

注意: q20::type_identity_t is a C++17 backport of C++20's std::type_identity_t .

約束

Participates in overload resolution only if

  • either N or extent are std::dynamic_extent or otherwise extent == N
  • and either S or const S are the same as T .

[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 referencing the data in the supplied span other .

約束

Participates in overload resolution only if

  • either N or extent are std::dynamic_extent or extent == N
  • and either S or const S are the same as T .

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

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

Returns whether the span is empty, that is, whether size() == 0 .

These functions do the same thing: empty () is provided for STL compatibility and isEmpty () is provided for Qt compatibility.

另請參閱 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 of size size() - pos referencing the remainder of this span after dropping the first pos 元素。

pos must be non-negative.

This span must hold at least pos elements ( E >= pos and size () >= pos ), otherwise the behavior is undefined.

These functions do the same thing: subspan () is provided for STL compatibility and sliced () is provided for Qt compatibility.

另請參閱 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 span of size n referencing the n elements of this span starting at pos .

Both pos and n must be non-negative.

This span must hold at least pos + n elements ( E >= pos + n and size () >= pos + n ), otherwise the behavior is undefined.

These functions do the same thing: subspan () is provided for STL compatibility and sliced () is provided for Qt compatibility.

另請參閱 subspan (), first (QSpan<T,E>::size_type), last (QSpan<T,E>::size_type), chopped (),和 slice ().

[default] QSpan:: QSpan ()

默認構造函數。

This constructor is only present if E is either zero (0) or std::dynamic_extent . In other words: only fixed-zero-sized or variable-sized spans are default-constructible.

另請參閱 extent and Variable-Size and Fixed-Size Spans .

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

Constructs a QSpan referencing the data in the supplied range r .

約束

Participates in overload resolution only if Range is a compatible range .

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

Constructs a QSpan referencing the data in the supplied initializer list il .

注意: This constructor is noexcept only if E is std::dynamic_extent .

注意: E 不是 std::dynamic_extent and the size of il 不是 E , the behavior is undefined.

約束

Participates in overload resolution only if T is const -qualified.

另請參閱 Const and Mutable Spans .

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

Constructs a QSpan referencing the data starting at first and having length ( last - first ).

[first, last) must be a valid range.

約束

Participates in overload resolution only if It is a compatible iterator .

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

Constructs a QSpan referencing the data starting at first and having length count .

[first, count) must be a valid range.

約束

Participates in overload resolution only if It is a compatible iterator .

[constexpr] auto QSpan:: back () const

Returns a reference to the last element in the span.

The span must not be empty, otherwise the behavior is undefined.

另請參閱 operator[] (), front (), size (), empty (),和 Const and Mutable Spans .

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

Returns an interator pointing at the beginning of the span.

因為 QSpan iterators are just pointers, this is the same as calling data ().

另請參閱 end (), cbegin (), rbegin (), crbegin (), data (),和 Const and Mutable Spans .

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

返迴 const_iterator pointing to the beginning of the span.

This will return a read-only iterator even if 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 pointing to one past the end of the span.

另請參閱 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 ) .

This function is only available on variable-sized spans .

該函數在 Qt 6.9 引入。

另請參閱 chopped ().

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

返迴 variable-sized span of size size () - n referencing the first size () - n elements of this span.

如同 first(size() - n) .

n must be non-negative.

This span must hold at least n elements ( E >= n and size () >= n ), otherwise the behavior is undefined.

該函數在 Qt 6.9 引入。

另請參閱 subspan (), first (QSpan<T,E>::size_type), last (QSpan<T,E>::size_type), and chop ().

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

返迴 const_reverse_iterator pointing to the beginning of the reversed span.

另請參閱 crend (), rbegin (), cbegin (), begin (),和 Const and Mutable Spans .

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

返迴 const_reverse_iterator pointing to one past the end of the reversed span.

另請參閱 crbegin (), rend (), cend (), end (),和 Const and Mutable Spans .

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

Returns a pointer to the beginning of the span.

The same as calling begin ().

另請參閱 begin (), front (),和 Const and Mutable Spans .

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

Returns an iterator pointing to one past the end of the span.

因為 QSpan iterators are just pointers, this it the same as calling data() + size() .

另請參閱 begin (), cend (), rend (), crend (), data (), size (),和 Const and Mutable Spans .

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

返迴 fixed-sized span of size Count referencing the first Count elements of *this .

The span must hold at least Count elements ( E >= Count and size () >= Count ), otherwise the behavior is undefined.

注意: This function is noexcept when subspan_always_succeeds_v<Count> is true .

另請參閱 first (QSpan<T,E>::size_type), last (),和 subspan ().

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

返迴 variable-sized span of size n referencing the first n elements of *this .

n must be non-negative.

The span must hold at least n elements ( E >= n and size () >= n ), otherwise the behavior is undefined.

另請參閱 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

Returns a reference to the first element in the span.

The span must not be empty, otherwise the behavior is undefined.

另請參閱 operator[] (), back (), size (), empty (),和 Const and Mutable Spans .

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

返迴 fixed-sized span of size Count referencing the last Count elements of *this .

The span must hold at least Count elements ( E >= Count and size () >= Count ), otherwise the behavior is undefined.

注意: This function is noexcept when subspan_always_succeeds_v<Count> is true .

另請參閱 last (QSpan<T,E>::size_type), first (),和 subspan ().

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

返迴 variable-sized span of size n referencing the last n elements of *this .

n must be non-negative.

The span must hold at least n elements ( E >= n and size () >= n ), otherwise the behavior is undefined.

另請參閱 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 pointing to the beginning of the reversed span.

另請參閱 rend (), crbegin (), begin (), cbegin (),和 Const and Mutable Spans .

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

返迴 reverse_iterator pointing to one past the end of the reversed span.

另請參閱 rbegin (), crend (), end (), cend (),和 Const and Mutable Spans .

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

Returns the size of the span, that is, the number of elements it references.

另請參閱 size_bytes (), empty (),和 isEmpty ().

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

Returns the size of the span in bytes, that is, the number of elements multiplied by sizeof(T) .

另請參閱 size (), empty (),和 isEmpty ().

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

如同 *this = sliced( pos ) .

This function is only available on 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 ) .

This function is only available on variable-sized spans .

該函數在 Qt 6.9 引入。

另請參閱 sliced ().

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

Returns a span of size Count referencing the Count elements of this span starting at Offset .

*this is a variable-sized span, the return type is a variable-sized span, otherwise it is a fixed-sized span.

This span must hold at least Offset + Count elements ( E >= Offset + Count and size () >= Offset + Count ), otherwise the behavior is undefined.

注意: This function is noexcept when subspan_always_succeeds_v<Offset + Count> is true .

另請參閱 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

Returns a span of size E - Offset referencing the remainder of this span after dropping the first Offset 元素。

*this is a variable-sized span, the return type is a variable-sized span, otherwise it is a fixed-sized span.

This span must hold at least Offset elements ( E >= Offset and size () >= Offset ), otherwise the behavior is undefined.

注意: This function is noexcept when subspan_always_succeeds_v<Offset> is true .

另請參閱 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

Returns a reference to the element at index idx in the span.

The index must be in range, that is, idx >= 0 and idx < size (), otherwise the behavior is undefined.

另請參閱 front (), back (), size (), empty (),和 Const and Mutable Spans .

成員變量文檔編製

const std::size_t QSpan:: extent

The second template argument of QSpan<T, E> , that is, E . This is std::dynamic_extent for variable-sized spans .

注意: While all other sizes and indexes in QSpan use qsizetype, this variable, like E , is actually of type size_t , for compatibility with std::span and std::dynamic_extent .

另請參閱 size ().

相關非成員

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

返迴 s 作為 QSpan<const std::byte, E'> whose size () is equal to s.size_bytes() .

E is std::dynamic_extent then so is E' 。否則, E' = E * sizeof(T) .

注意: q20::dynamic_extent is a C++17 backport of C++20's 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'> whose size () is equal to s.size_bytes() .

E is std::dynamic_extent then so is E' 。否則, E' = E * sizeof(T) .

注意: q20::dynamic_extent is a C++17 backport of C++20's std::dynamic_extent .

約束

Participates in overload resolution only if !std::is_const_v<T> .

該函數在 Qt 6.8 引入。

另請參閱 as_bytes (), size_bytes (),和 Const and Mutable Spans .