Namespaces
Variants

std:: span

From ja.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 非ゼロ静的な範囲を持つspanviewではなかった あらゆるspanviewとなる

関連項目

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