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

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

パブリック型

パブリック関数

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

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と変更可能スパン

コンテナを所有する場合とは異なり、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_iteratorConst 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_typereferenceconst_pointerConst and Mutable Spansも参照してください

[alias] QSpan::const_reverse_iterator

std::reverse_iterator<const_iterator> の別名。

const_iteratorreverse_iteratorConst and Mutable Spansも参照の こと。

[alias] QSpan::difference_type

qptrdiff のエイリアス。これは differs from std::span.

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

[alias] QSpan::element_type

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

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

value_typepointerConst and Mutable Spansも参照してください

[alias] QSpan::iterator

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

pointerconst_iteratorreverse_iteratorConst 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_typeconst_referencepointerConst and Mutable Spansも参照してください

[alias] QSpan::reverse_iterator

std::reverse_iterator<iterator> のエイリアス。const があればそれも含む。

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

これらの特別メンバー関数は暗黙的に定義される。

注: 移動はコピーと同等である。参照されるデータではなく、data ()とsize ()のみがスパンからスパンへコピーされる。

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

与えられた spanother のデータを参照するQSpan を構築する。

注意: このコンストラクタがオーバーロード解決に参加するのは

  • N またはextent のいずれかがstd::dynamic_extent またはextent == である場合。N
  • であり、S またはconst S のいずれかがT と同じである場合にのみ、オーバーロード解決に参加します。

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

[constexpr 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() - posvariable-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 要素を参照する、サイズnvariable-sized スパンを返す。

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 およびVariable-Size and Fixed-Size Spansも参照してください

[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-修飾されている場合にのみ、オーバーロード解決に参加します。

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

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

注意: このコンストラクタは、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 内の最後の要素への参照を返します。

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 を返す。

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

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 要素を参照する、サイズCountfixed-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 要素を参照する、サイズnvariable-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 要素を参照する、サイズCountfixed-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 要素を参照する、サイズnvariable-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 を返す。

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

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()、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.