QSpan Class
template <typename T, std::size_t E = std::size_t(-1)> class QSpan連続したデータに対する非所有コンテナ。詳細...
Header: | #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 |
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 |
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オブジェクトが参照するデータより長くないことを保証しなければならない。
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は、固定サイズまたは可変サイズにすることができます。
可変サイズのスパンは、上の例で見られるように、2番目のテンプレート引数を省略する(または、それをstd::dynamic_extent
に設定する、しかし、これは、C++20 ビルドでのみ利用可能である)ことによって形成される。
固定サイズのスパンは、2番目のテンプレート引数に数値を渡すことで形成されます:
その名前が示すように、固定サイズ・スパンのsize ()はコンパイル時に固定されるのに対し、可変サイズ・スパンのsize ()は実行時にのみ決定されます。
固定サイズのスパンは、(そのextent がゼロ(0)でない限り)デフォルト構成可能ではありません。可変サイズのスパンはデフォルトで構成可能であり、data() == nullptr
とsize() == 0
を持つ。
固定サイズのスパンは、暗黙的に可変サイズのスパンに変換することができます。逆の方向(可変長から固定長へ)には、両方のスパンのサイズが一致しなければならないという前提条件があります。
コンテナを所有する場合とは異なり、const
はQSpanでは浅い。const QSpanを通してデータを修正することはできる(しかし、QSpan<const T>
を通して修正することはできない)。また、begin() とend() は、const
/non-const
ではオーバーロードされない。しかし、cbegin() とcend() は、T
がconstでなくても、データの変更を防ぐconst_iteratorsを返す:
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 vs. std::span
QSpanは、std::spanと密接にモデル化されているが、いくつかの違いがある。どちらも暗黙のうちに互いに変換し合うので、自分のコードでどちらが好きかを選ぶのは自由である。
- QSpanは、
size_type
として符号付きqsizetypeを使用しているのに対し、std::span
は、size_t
を使用している。 - すべてのQSpanコンストラクタは暗黙的であり、多くの
std::span
はexplicit
。 - QSpanはrvalueを所有するコンテナから構築できるが、
std::span
。
最後の2つは、所有コンテナを取っていた関数が、代わりにQSpanを取るように変換されるとき、ソース互換性のために必要である。qsizetypeの使用は、Qtコンテナの残りの部分との一貫性のためである。QSpanテンプレート引数は、不必要なエラー状態(負のサイズ)を導入することを避けるために、まだsize_tを使用する。
互換性のあるイテレータ
QSpanは、イテレータが互換性のあるものであれば、イテレータとサイズ、またはイテレータペアから構築できる。最終的には、これはC++20std::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も参照 。
[alias]
QSpan::const_pointer
const T*
およびconst element_type*
のエイリアス。
このエイリアスは STL との互換性のために用意されています。
element_type,pointer,const_reference,const_iteratorも参照して ください。
[alias]
QSpan::const_reference
それぞれconst T&
およびconst element_type&
のエイリアス。
このエイリアスは STL との互換性のために提供されています。
element_type,reference,const_pointerも参照して ください。
[alias]
QSpan::const_reverse_iterator
std::reverse_iterator<const_iterator>
のエイリアス。
const_iterator およびreverse_iterator も参照して ください。
[alias]
QSpan::difference_type
qptrdiff のエイリアス。これは differs from std::span
.
このエイリアスは STL との互換性のために提供されています。
[alias]
QSpan::element_type
T
のエイリアスです。const
があればそれも含む。
このエイリアスは STL との互換性のために提供されています。
value_type およびpointerも参照してください 。
[alias]
QSpan::iterator
T*
およびpointer
のエイリアス。const
があればそれも含みます。
pointer 、const_iterator 、reverse_iteratorも参照して ください。
[alias]
QSpan::pointer
それぞれT*
とelement_type*
のエイリアス。const
があればそれも含む。
このエイリアスは STL との互換性のために提供されています。
element_type,const_pointer,reference,iteratorも参照してください 。
[alias]
QSpan::reference
それぞれT&
およびelement_type&
のエイリアス。const
があれば、それも含みます。
このエイリアスは STL との互換性のために提供されています。
element_type 、const_reference 、pointerも参照してください 。
[alias]
QSpan::reverse_iterator
std::reverse_iterator<iterator>
のエイリアス。const
があればそれも含みます。
iterator およびconst_reverse_iterator も参照して ください。
[alias]
QSpan::size_type
qsizetype のエイリアス。この differs from std::span
.
このエイリアスは STL との互換性のために提供されています。
[alias]
QSpan::value_type
T
のエイリアス。const
がある場合は除く。
このエイリアスは STL との互換性のために提供されています。
element_typeも参照してください 。
メンバ関数ドキュメント
[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()
これらの特殊メンバ関数は暗黙的に定義されています。
[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)
与えられた配列arr のデータを参照するQSpan を構築する。
注意: このコンストラクタがオーバーロード解決に参加するのは、以下の場合のみです。
N
またはextent のいずれかがstd::dynamic_extent
であるか、そうでなければextent==
である場合。N
- であり、
S
またはconst S
がT
と同じである場合にのみ、オーバーロード解決に参加します。
注: q20::type_identity_t
は、C++20 の std::type_identity_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)
与えられたスパンother のデータを参照するQSpan を構築します。
注: このコンストラクタがオーバーロード解決に参加するのは、次の場合だけです。
N
またはextent のいずれかがstd::dynamic_extent
またはextent==
である場合。N
- であり、
S
またはconst S
のいずれかがT
と同じである場合にのみ、オーバーロード解決に参加します。
スパンが空かどうか、つまりsize() == 0
かどうかを返します。
empty() は STL との互換性のために、isEmpty() は Qt との互換性のために用意されています。
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
最初のpos 要素を取り除いた後のこのスパンの余りを参照する、サイズsize() - 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]
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
pos から始まるこのスパンのn 要素を参照する、サイズ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)も参照してください 。
[default]
QSpan::QSpan()
デフォルトコンストラクタ。
このコンストラクタは、E
がゼロ(0)か、std::dynamic_extent
の場合のみ存在します。 言い換えれば、固定ゼロサイズか可変サイズのスパンのみがデフォルトコンストラクタ可能です。
extentも参照してください 。
[constexpr]
template <typename Range, QSpan<T, E>::if_compatible_range<Range> = true> QSpan::QSpan(Range &&r)
与えられた範囲r のデータを参照する QSpan を構築します。
注意: このコンストラクタは、Range
がa compatible range の場合のみ、オーバーロード解決に参加します。
[constexpr]
QSpan::QSpan(std::initializer_list<QSpan<T, E>::value_type> il)
与えられたイニシャライザリストil のデータを参照するQSpanを構築します。
注意: このコンストラクタは、T
がconst
-qualifiedである場合のみ、オーバーロード解決に参加します。
注意 :このコンストラクタは、E
がstd::dynamic_extent
の場合のみ、noexcept
となります。
注: E
がstd::dynamic_extent
でなく、il のサイズがE
でない場合、動作は未定義です。
[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)
first で始まり、長さcount を持つデータを参照する QSpan を構築します。
[first, count)
は有効な範囲でなければなりません。
注意: このコンストラクタは、It
がa compatible iterator である場合にのみ、オーバーロード解決に参加します。
[constexpr]
auto QSpan::back() const
スパン内の最後の要素への参照を返します。
span は空であってはならず、そうでない場合の動作は未定義です。
operator[]()、front()、size()、empty()も参照 。
[constexpr noexcept]
auto QSpan::begin() const
span の先頭を指すイテレータを返します。
QSpan イテレータは単なるポインタなので、これはdata() を呼び出すのと同じです。
end()、cbegin()、rbegin()、crbegin()、data()も参照 。
[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()も参照のこと 。
[constexpr noexcept]
auto QSpan::cend() const
スパンの末尾からひとつ先を指すconst_iterator を返す。
cbegin()、end()、crend()、rend()、data()、size() も参照の こと。
[constexpr noexcept]
auto QSpan::crbegin() const
反転したスパンの先頭を指すconst_reverse_iterator を返す。
crend()、rbegin()、cbegin()、begin()も参照のこと 。
[constexpr noexcept]
auto QSpan::crend() const
const_reverse_iterator は、反転したスパンの末尾を指す。
crbegin()、rend()、cend()、end()も参照の こと。
[constexpr noexcept]
auto QSpan::data() const
スパンの先頭へのポインタを返す。
begin() を呼び出すのと同じ。
[constexpr noexcept]
auto QSpan::end() const
スパンの終端のひとつ先を指すイテレータを返します。
QSpan イテレータは単なるポインタなので、これはdata() + size()
を呼び出すのと同じである。
begin()、cend()、rend()、crend()、data()、size()も参照 。
[constexpr noexcept(...)]
template <std::size_t Count> auto QSpan::first() const
*this
の最初のCount
要素を参照する、サイズCount
の固定サイズの span を返す。
このスパンは、少なくともCount
要素(E
>=Count
かつ size() >=Count
)を保持していなければならず、そうでない場合の動作は未定義である。
注意: この関数は、"subspan_always_succeeds_v<Count>" が真である場合、いかなる例外も投げません。
first(QSpan<T,E>::size_type),last(),subspan()も参照 。
[constexpr]
auto QSpan::first(QSpan<T, E>::size_type n) const
*this
の最初のn 要素を参照するサイズ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]
auto QSpan::front() const
スパン内の最初の要素への参照を返します。
スパンは空であってはならず、そうでない場合の動作は未定義です。
operator[]()、back()、size()、empty()も参照 。
[constexpr noexcept(...)]
template <std::size_t Count> auto QSpan::last() const
*this
の最後のCount
要素を参照する、サイズCount
の固定サイズの span を返す。
このスパンは、少なくともCount
要素(E
>=Count
かつ size() >=Count
)を保持していなければならない。
注意: この関数は、"subspan_always_succeeds_v<Count>" が真である場合、いかなる例外も投げない。
last(QSpan<T,E>::size_type),first(),subspan()も参照 。
[constexpr]
auto QSpan::last(QSpan<T, E>::size_type n) const
*this
の最後の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]
auto QSpan::rbegin() const
反転されたスパンの先頭を指すreverse_iterator を返します。
rend()、crbegin()、begin()、cbegin()も参照 。
[constexpr noexcept]
auto QSpan::rend() const
reverse_iterator は、反転したスパンの末尾を指す。
rbegin()、crend()、end()、cend()も参照 。
[constexpr noexcept]
auto QSpan::size() const
span のサイズ、つまり参照している要素の数を返します。
size_bytes()、empty()、isEmpty() も参照 。
[constexpr noexcept]
auto QSpan::size_bytes() const
スパンのサイズをバイト単位、つまり要素数にsizeof(T)
を掛けた値で返す。
size()、empty()、およびisEmpty() も参照 。
[constexpr noexcept(...)]
template <std::size_t Offset, std::size_t Count> auto QSpan::subspan() const
Offset
から始まるこのスパンのCount
要素を参照する、サイズCount
のスパンを返す。
*this
が可変サイズのスパンである場合、戻り値の型は可変サイズのスパンであり、そうでない場合は固定サイズのスパンである。
このスパンは、少なくともOffset + Count
要素(E
>=Offset + Count
かつ size() >=Offset + Count
)を保持しなければならず、そうでない場合の動作は未定義である。
注意: この関数は、"subspan_always_succeeds_v<Offset + Count>"が真である場合、いかなる例外も投げません。
subspan(QSpan<T,E>::size_type, QSpan<T,E>::size_type), subspan(),first(),last()も参照 。
[constexpr noexcept(...)]
template <std::size_t Offset> auto QSpan::subspan() const
最初のOffset
要素を取り除いた後のこのスパンの残りを参照する、サイズE - Offset
のスパンを返す。
*this
が可変サイズのスパンである場合、戻り値の型は可変サイズのスパンであり、そうでない場合は固定サイズのスパンである。
このスパンは、少なくともOffset
要素(E
>=Offset
と size() >=Offset
)を保持しなければならない。そうでない場合の動作は未定義である。
注意: この関数は、"subspan_always_succeeds_v<Offset>" が真である場合、例外を投げません。
subspan(QSpan<T,E>::size_type),subspan(),first(),last()も参照 。
[constexpr]
QSpan<T, E>::reference QSpan::operator[](QSpan<T, E>::size_type idx) const
スパンのインデックスidx にある要素への参照を返します。
インデックスが範囲内になければならない、つまり、idx >= 0かつidx <size()でなければならない。そうでない場合の動作は未定義である。
メンバ変数ドキュメント
const std::size_t QSpan::extent
QSpan<T, E>
の2番目のテンプレート引数、つまりE
。これは、可変サイズのスパンに対するstd::dynamic_extent
です。
注意: QSpan の他のすべてのサイズとインデックスは qsizetype を使用しますが、この変数はE
と同様、std::span
やstd::dynamic_extent
との互換性のために、実際にはsize_t
型です。
size()も参照のこと 。
関連する非メンバー
[noexcept, since 6.8]
auto as_bytes(QSpan<T, E> s)
size() がs.size_bytes()
と等しいQSpan<const std::byte, E'>
としてs を返す。
E
がstd::dynamic_extent
である場合、E'
も同様である。それ以外の場合はE' = E * sizeof(T)
。
注: q20::dynamic_extent
は、C++20 の std::dynamic_extent
.
この関数は Qt 6.8 で導入されました。
as_writable_bytes() およびsize_bytes()も参照して ください。
[noexcept, since 6.8]
auto as_writable_bytes(QSpan<T, E> s)
size() がs.size_bytes()
と等しいQSpan<std::byte, E'>
としてs を返します。
E
がstd::dynamic_extent
であれば、E'
も同じです。そうでない場合はE' = E * sizeof(T)
。
注意: この関数は、!std::is_const_v<T>
の場合のみオーバーロード解決に参加します。
注: q20::dynamic_extent
は、C++20 の std::dynamic_extent
.
この関数は Qt 6.8 で導入されました。
as_bytes() およびsize_bytes()も参照してください 。
©2024 The Qt Company Ltd. 本文書に含まれる文書の著作権は、それぞれの所有者に帰属します。 本書で提供されるドキュメントは、Free Software Foundation が発行したGNU Free Documentation License version 1.3に基づいてライセンスされています。 Qtおよびそれぞれのロゴは、フィンランドおよびその他の国におけるThe Qt Company Ltd.の 商標です。その他すべての商標は、それぞれの所有者に帰属します。