QSpan Class
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() | |
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
(Const and Mutable Spans を参照)の上に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と変更可能スパン
コンテナを所有する場合とは異なり、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 、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も参照してください 。
メンバ関数ドキュメント
[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)
与えられた spanother のデータを参照する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
のvariable-sized スパンを返す。
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 のvariable-sized スパンを返す。
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 およびVariable-Size and Fixed-Size Spansも参照してください 。
[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
-修飾されている場合にのみ、オーバーロード解決に参加します。
注意 :このコンストラクタは、E
がstd::dynamic_extent
の場合のみ、noexcept
となります。
注意 :E
がstd::dynamic_extent
でなく、il のサイズがE
でない場合、動作は未定義です。
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)
first から始まり、長さcount を持つデータを参照する QSpan を構築する。
[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
スパンの末尾の一つ前を指すconst_iterator を返す。
cbegin(),end(),crend(),rend(),data(),size(),Const and Mutable Spansも参照のこと 。
[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も参照 。
[constexpr noexcept]
auto QSpan::end() const
スパンの終端から1つ先を指すイテレータを返す。
QSpan のイテレータは単なるポインタなので、これはdata() + size()
を呼び出すのと同じである。
begin()、cend()、rend()、crend()、data()、size()、Const and Mutable Spansも参照のこと 。
[constexpr noexcept(...)]
template <std::size_t Count> auto QSpan::first() const
*this
の最初のCount
要素を参照する、サイズCount
のfixed-sized 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
*this
の最初のn 要素を参照する、サイズn のvariable-sized スパンを返す。
n は負であってはならない。
スパンは、少なくとも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
span 内の最初の要素への参照を返します。
span は空であってはならず、そうでない場合の動作は未定義です。
operator[](),back(),size(),empty(),Const and Mutable Spansも参照 。
[constexpr noexcept(...)]
template <std::size_t Count> auto QSpan::last() const
*this
の最後のCount
要素を参照する、サイズCount
のfixed-sized 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
*this
の最後のn 要素を参照する、サイズn のvariable-sized スパンを返す。
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()も参照 。
[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
スパンのサイズをバイト単位で、つまり要素数に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>
がtrue
のとき、この関数は noexcept となる。
subspan(QSpan<T,E>::size_type, QSpan<T,E>::size_type), subspan(),first(),last(),Variable-Size and Fixed-Size Spansも参照 。
[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>
がtrue
のとき、この関数は noexcept となる。
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
スパン内のインデックスidx にある要素への参照を返す。
インデックスが範囲内、つまりidx >= 0 かつidx <size() でなければならず、そうでない場合の動作は未定義である。
front(),back(),size(),empty(),Const and Mutable Spansも参照のこと 。
メンバ変数のドキュメント
const std::size_t QSpan::extent
QSpan<T, E>
の2番目のテンプレート引数、つまりE
。これはvariable-sized spans に対する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(),Const and Mutable Spansも参照してください 。
[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()、Const and Mutable Spansも参照してください 。
© 2025 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.