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() を使って書きなさい。