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

注:このクラスの関数はすべてリエントラントです。

パブリック型

パブリック関数

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番目のテンプレート引数に数値を渡すことで形成されます:

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

その名前が示すように、固定サイズ・スパンのsize ()はコンパイル時に固定されるのに対し、可変サイズ・スパンのsize ()は実行時にのみ決定されます。

固定サイズのスパンは、(そのextent がゼロ(0)でない限り)デフォルト構成可能ではありません。可変サイズのスパンはデフォルトで構成可能であり、data() == nullptrsize() == 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::spanexplicit
  • QSpanはrvalueを所有するコンテナから構築できるが、std::span

最後の2つは、所有コンテナを取っていた関数が、代わりにQSpanを取るように変換されるとき、ソース互換性のために必要である。qsizetypeの使用は、Qtコンテナの残りの部分との一貫性のためである。QSpanテンプレート引数は、不必要なエラー状態(負のサイズ)を導入することを避けるために、まだsize_tを使用する。

互換性のあるイテレータ

QSpanは、イテレータが互換性のあるものであれば、イテレータとサイズ、またはイテレータペアから構築できる。最終的には、これはC++20std::contiguous_iteratorstd::sentinel_for を意味するはずだが、QtがまだC++17をサポートしている間は、生のポインタだけが連続イテレータとみなされる。

互換性のある範囲

QSpanは、互換性のある範囲から構築することもできる。範囲は、compatible iterators を持つ場合、互換性があります。

QList,QStringView,QLatin1StringView, およびQUtf8StringViewも参照のこと

メンバ型ドキュメント

[alias] QSpan::const_iterator

const T* およびconst_pointer のエイリアス。

const_pointeriteratorconst_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 があればそれも含みます。

pointerconst_iteratorreverse_iteratorも参照して ください。

[alias] QSpan::pointer

それぞれT*element_type* のエイリアス。const があればそれも含む。

このエイリアスは STL との互換性のために提供されています。

element_type,const_pointer,reference,iteratorも参照してください

[alias] QSpan::reference

それぞれT& およびelement_type& のエイリアス。const があれば、それも含みます。

このエイリアスは STL との互換性のために提供されています。

element_typeconst_referencepointerも参照してください

[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()

これらの特殊メンバ関数は暗黙的に定義されています。

注: 移動はコピーに相当する。参照されるデータではなく、data ()とsize ()のみがspanからspanへコピーされる。

[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 ST と同じである場合にのみ、オーバーロード解決に参加します。

注: 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 と同じである場合にのみ、オーバーロード解決に参加します。

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

[noexcept] auto QSpan::isEmpty() const

スパンが空かどうか、つまり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 の可変サイズのスパンを返す。

posn はともに非負でなければならない。

このスパンは、少なくとも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 を構築します。

注意: このコンストラクタは、Rangea compatible range の場合のみ、オーバーロード解決に参加します。

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

与えられたイニシャライザリストil のデータを参照するQSpanを構築します。

注意: このコンストラクタは、Tconst-qualifiedである場合のみ、オーバーロード解決に参加します。

注意 :このコンストラクタは、Estd::dynamic_extent の場合のみ、noexcept となります。

注: Estd::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) は有効な範囲でなければなりません。

注意: このコンストラクタは、Ita 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) は有効な範囲でなければなりません。

注意: このコンストラクタは、Ita 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 を返します。

これは、Tconst でない場合でも、読み取り専用のイテレータを返します:

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() を呼び出すのと同じ。

begin() およびfront()も参照

[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()でなければならない。そうでない場合の動作は未定義である。

front(),back(),size(),empty()も参照のこと

メンバ変数ドキュメント

const std::size_t QSpan::extent

QSpan<T, E> の2番目のテンプレート引数、つまりE 。これは、可変サイズのスパンに対するstd::dynamic_extent です。

注意: QSpan の他のすべてのサイズとインデックスは qsizetype を使用しますが、この変数はE と同様、std::spanstd::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 を返す。

Estd::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 を返します。

Estd::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.の 商標です。その他すべての商標は、それぞれの所有者に帰属します。