C++/標準ライブラリ/span
表示
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 クラスを中心に、様々な機能が用意されています。メモリ安全性と書きやすさを両立できる有用なヘッダーです。
演習問題
[編集]- std::spanを使って、入力された整数配列の合計を計算する関数を書きなさい。
- 与えられた文字列からスペース区切りの単語を取り出し、ベクターに格納する関数をstd::spanを使って書きなさい。
- あるコンテナに対して、先頭から3分の1の要素を別のコンテナにコピーする関数を std::span::subspan() を使って書きなさい。