Namespaces
Variants

std:: span

From cppreference.net
ヘッダーで定義 <span>
template <

class T,
std:: size_t Extent = std:: dynamic_extent

> class span ;
(C++20以降)

クラステンプレート span は、位置ゼロから始まる連続したオブジェクトシーケンスを参照できるオブジェクトを記述します。 span static エクステント(コンパイル時にシーケンスの要素数が既知で型にエンコードされる)を持つか、あるいは dynamic エクステントを持つかのいずれかです。

span s に対して、要素へのポインタ、イテレータ、および参照は、 s の範囲 [ s. data ( ) , s. data ( ) + s. size ( ) ) 内のポインタが無効化される操作によって無効化されます。

std::span のすべての特殊化は TriviallyCopyable 型です。

(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 >
  1. iterator is a mutable iterator if T is 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)
イテレータ
先頭を指すイテレータを返す
(public member function)
(C++23)
終端を指すイテレータを返す
(public member function)
先頭を指す逆イテレータを返す
(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)

非メンバー関数

span をその基礎となるバイトのビューに変換する
(関数テンプレート)

ヘルパー定数

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)
多次元非所有配列ビュー
(クラステンプレート)
イテレータとセンチネルのペアを view に結合する
(クラステンプレート)
リスト初期化 で作成された一時配列を参照する
(クラステンプレート)
読み取り専用文字列ビュー
(クラステンプレート)