コンテンツにスキップ

C++/標準ライブラリ/span

出典: フリー教科書『ウィキブックス(Wikibooks)』

C++教科書/標準ライブラリ編/<span>の章[編集]

はじめに[編集]

C++20で導入された <span> ヘッダーは、配列やコンテナに対する一連の非所有権ビュー(views)を提供します。std::span は、連続したメモリ上の要素シーケンスに対する安全なアクセスを可能にします。これにより、配列の添字アクセスに関連するバグを回避でき、コードの安全性が向上します。

クラス[編集]

std::span クラステンプレート[編集]

std::span クラステンプレートは、このヘッダーの中核をなすクラスです。

コンストラクタ
  • デフォルトコンストラクタ:span()
  • 範囲からのコンストラクタ:span(イテレータ開始、要素数)span(イテレータ開始、イテレータ終了)
  • 配列からのコンストラクタ:span(配列)
  • 他のstd::span オブジェクトからのコンストラクタ
コピー/ムーブコンストラクタと代入演算子もサポートされています。
サブビューの生成
first(),last(),subspan() を使って部分ビューを作成できます。
オブザーバ
size(),size_bytes(),empty() でサイズや空かどうかをチェックできます。
要素アクセス
operator[],front(),back(),data() で要素にアクセスできます。
イテレータサポート
begin(),end(),rbegin(),rend() でイテレータを取得できます。

[編集]

int arr[] = {1, 2, 3, 4, 5};
std::span<int> mySpan(arr); // スパンを配列から作成

for (int& x : mySpan) {
 std::cout << x << " "; // 出力: 1 2 3 4 5
}

std::span<int, 2> subSpan = mySpan.last<2>(); // 末尾2要素の部分ビュー
std::cout << subSpan[0] << " " << subSpan[1]; // 出力: 4 5

定数[編集]

dynamic_extent は、std::span オブジェクトが動的な範囲を持つことを示す定数です。デフォルト値です。

関数[編集]

as_bytes(),as_writable_bytes() はオブジェクトの生のバイト表現をstd::span で取得するユーティリティ関数です。

begin(),end(),rbegin(),rend(),size(),empty(),data() は、コンテナや配列に対するビュー取得のための一連の関数です。

コンセプト[編集]

__integral_constant_like は、整数値を値として持つ型を表すコンセプトです。動的なstd::span の範囲を表すのに使われます。

まとめ[編集]

<span> ヘッダーにより、配列やコンテナに対する安全で便利なビューが提供されます。std::span クラスを中心に、様々な機能が用意されています。メモリ安全性と書きやすさを両立できる有用なヘッダーです。

演習問題[編集]

  1. std::spanを使って、入力された整数配列の合計を計算する関数を書きなさい。
  2. 与えられた文字列からスペース区切りの単語を取り出し、ベクターに格納する関数をstd::spanを使って書きなさい。
  3. あるコンテナに対して、先頭から3分の1の要素を別のコンテナにコピーする関数を std::span::subspan() を使って書きなさい。