std:: span
|
ヘッダーで定義
<span>
|
||
|
template
<
class
T,
|
(C++20以降) | |
クラステンプレート
span
は、位置ゼロから始まる連続したオブジェクトシーケンスを参照できるオブジェクトを記述します。
span
は
static
エクステント(コンパイル時にシーケンスの要素数が既知で型にエンコードされる)を持つか、あるいは
dynamic
エクステントを持つかのいずれかです。
span
s
に対して、要素へのポインタ、イテレータ、および参照は、
s
の範囲
[
s.
data
(
)
,
s.
data
(
)
+
s.
size
(
)
)
内のポインタが無効化される操作によって無効化されます。
|
|
(C++23以降) |
目次 |
テンプレートパラメータ
| T | - | 要素型; 抽象クラス型ではない完全なオブジェクト型でなければならない |
| Extent | - |
シーケンス内の要素数、または動的な場合は
std::dynamic_extent
|
ネスト型
| 型 | 定義 |
element_type
|
T
|
value_type
|
std:: remove_cv_t < T > |
size_type
|
std::size_t |
difference_type
|
std::ptrdiff_t |
pointer
|
T * |
const_pointer
|
const T * |
reference
|
T & |
const_reference
|
const T & |
iterator
[1]
|
実装定義
LegacyRandomAccessIterator
、
ConstexprIterator
および
contiguous_iterator
で、
value_type
が
value_type
であるもの
|
const_iterator
(C++23以降)
|
std:: const_iterator < iterator > |
reverse_iterator
|
std:: reverse_iterator < iterator > |
const_reverse_iterator
(C++23以降)
|
std:: const_iterator < reverse_iterator > |
-
↑
iteratoris a mutable iterator ifTis not const-qualified.
Container
のイテレータ型に対するすべての要件は、
span
の
iterator
型にも同様に適用されます。
データメンバ
| メンバー | 説明 |
|
constexpr
std::
size_t
extent
[static]
|
Extent
(公開静的メンバー定数) |
pointer
data_
|
基となるシーケンスへのポインタ
( 説明専用メンバーオブジェクト* ) |
size_type
size_
(エクステントが 動的 の場合のみ存在) |
要素数
( 説明専用メンバーオブジェクト* ) |
メンバー関数
span
を構築する
(public member function) |
|
span
を代入する
(public member function) |
|
|
(destructor)
(implicitly declared)
|
span
を破棄する
(public member function) |
イテレータ |
|
|
(C++23)
|
先頭を指すイテレータを返す
(public member function) |
|
(C++23)
|
終端を指すイテレータを返す
(public member function) |
|
(C++23)
|
先頭を指す逆イテレータを返す
(public member function) |
|
(C++23)
|
終端を指す逆イテレータを返す
(public member function) |
要素アクセス |
|
|
先頭要素にアクセスする
(public member function) |
|
|
末尾要素にアクセスする
(public member function) |
|
|
(C++26)
|
境界チェック付きで指定された要素にアクセスする
(public member function) |
|
指定された要素にアクセスする
(public member function) |
|
|
基となる連続ストレージへの直接アクセス
(public member function) |
|
オブザーバ |
|
|
要素数を返す
(public member function) |
|
|
シーケンスのサイズをバイト単位で返す
(public member function) |
|
|
シーケンスが空かどうかをチェックする
(public member function) |
|
サブビュー |
|
シーケンスの先頭
N
要素からなるサブスパンを取得する
(public member function) |
|
シーケンスの末尾
N
要素からなるサブスパンを取得する
(public member function) |
|
|
サブスパンを取得する
(public member function) |
|
非メンバー関数
|
(C++20)
|
span
をその基礎となるバイトのビューに変換する
(関数テンプレート) |
ヘルパー定数
|
(C++20)
|
std::size_t
型の定数で、
span
が動的エクステントを持つことを示す
(定数) |
ヘルパーテンプレート
|
template
<
class
T,
std::
size_t
Extent
>
constexpr bool ranges:: enable_borrowed_range < std :: span < T, Extent >> = true ; |
(C++20以降) | |
この
ranges::enable_borrowed_range
の特殊化は、
span
が
borrowed_range
を満たすようにします。
|
template
<
class
T,
std::
size_t
Extent
>
constexpr bool ranges:: enable_view < std :: span < T, Extent >> = true ; |
(C++20以降) | |
この
ranges::enable_view
の特殊化は、
span
が
view
を満たすようにします。
推論ガイド
注記
std::span
の特殊化は、C++23で導入された正式な要件以前から、既存のすべての実装においてすでに自明にコピー可能な型です。
| 機能テスト マクロ | 値 | 標準 | 機能 |
|---|---|---|---|
__cpp_lib_span
|
202002L
|
(C++20) |
std::span
|
202311L
|
(C++26) | std::span::at | |
__cpp_lib_span_initializer_list
|
202311L
|
(C++26) |
std::span
の
std::initializer_list
からの構築
|
例
この例では、連続した範囲に対するいくつかのアルゴリズムを実装するために
std::span
を使用しています。
#include <algorithm> #include <cstddef> #include <iostream> #include <span> template<class T, std::size_t N> [[nodiscard]] constexpr auto slide(std::span<T, N> s, std::size_t offset, std::size_t width) { return s.subspan(offset, offset + width <= s.size() ? width : 0U); } template<class T, std::size_t N, std::size_t M> constexpr bool starts_with(std::span<T, N> data, std::span<T, M> prefix) { return data.size() >= prefix.size() && std::equal(prefix.begin(), prefix.end(), data.begin()); } template<class T, std::size_t N, std::size_t M> constexpr bool ends_with(std::span<T, N> data, std::span<T, M> suffix) { return data.size() >= suffix.size() && std::equal(data.end() - suffix.size(), data.end(), suffix.end() - suffix.size()); } template<class T, std::size_t N, std::size_t M> constexpr bool contains(std::span<T, N> span, std::span<T, M> sub) { return std::ranges::search(span, sub).begin() != span.end(); } void println(const auto& seq) { for (const auto& elem : seq) std::cout << elem << ' '; std::cout << '\n'; } int main() { constexpr int a[] (注:元のテキストは閉じ括弧のみのため、日本語でも同じ記号を保持します){0, 1, 2, 3, 4, 5, 6, 7, 8}; constexpr int b[]{8, 7, 6}; constexpr static std::size_t width{6}; for (std::size_t offset{}; ; ++offset) if (auto s = slide(std::span{a}, offset, width); !s.empty()) println(s); else break; static_assert("" && starts_with(std::span{a}, std::span{a, 4}) && starts_with(std::span{a + 1, 4}, std::span{a + 1, 3}) && !starts_with(std::span{a}, std::span{b}) && !starts_with(std::span{a, 8}, std::span{a + 1, 3}) && ends_with(std::span{a}, std::span{a + 6, 3}) && !ends_with(std::span{a}, std::span{a + 6, 2}) && contains(std::span{a}, std::span{a + 1, 4}) && !contains(std::span{a, 8}, std::span{a, 9}) ); }
出力:
0 1 2 3 4 5 1 2 3 4 5 6 2 3 4 5 6 7 3 4 5 6 7 8
不具合報告
以下の動作変更の欠陥報告書は、以前に公開されたC++規格に対して遡及的に適用されました。
| DR | 適用対象 | 公開時の動作 | 修正後の動作 |
|---|---|---|---|
| LWG 3203 | C++20 |
span
の要素へのポインタ、イテレータ、参照が
無効化されるタイミングが不明確だった |
明確化された |
| LWG 3903 | C++20 |
span
のデストラクタ宣言が不要だった
|
宣言を削除 |
| P2325R3 | C++20 |
非ゼロ静的な範囲を持つ
span
は
view
ではなかった
|
あらゆる
span
が
view
となる
|
関連項目
|
(C++23)
|
多次元非所有配列ビュー
(クラステンプレート) |
|
(C++20)
|
イテレータとセンチネルのペアを
view
に結合する
(クラステンプレート) |
|
(C++11)
|
リスト初期化
で作成された一時配列を参照する
(クラステンプレート) |
|
(C++17)
|
読み取り専用文字列ビュー
(クラステンプレート) |