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