std::spanの基礎
連続データに対する非所有ビューです
「std::spanの基礎」はCoddyKit上の無料C++ Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはC++ Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 C++ Academyコースには全4レッスンが含まれています。
所有権を持たないビュー
std::span<T>(C++20)は、連続した要素列に対する軽量なビューです。string_viewに似ていますが、任意の要素型に使用できます。<span>をインクルードしてください。
#include <iostream>
#include <span>
#include <array>
int main() {
std::array<int, 3> a = {1, 2, 3};
std::span<int> s = a;
std::cout << s.size() << "\n";
}spanは所有しない
spanはポインターと長さを保持します。別の場所で所有されているデータを参照するだけで、要素をコピーすることはありません。
#include <iostream>
#include <vector>
#include <span>
int main() {
std::vector<int> v = {5, 6, 7};
std::span<int> s = v;
s[0] = 50; // modifies v
std::cout << v[0] << "\n"; // 50
}std::arrayから作成
配列は自動的にspanへ変換され、spanからすべての要素を参照できます。
#include <iostream>
#include <span>
#include <array>
int main() {
std::array<int, 4> a = {1, 2, 3, 4};
std::span<int> s{a};
for (int x : s) std::cout << x << " ";
std::cout << "\n";
}vectorから作成
std::vectorもspanへ変換できるため、基になるコンテナーに関係なく統一されたビューを使用できます。
#include <iostream>
#include <vector>
#include <span>
int main() {
std::vector<int> v = {9, 8, 7};
std::span<int> s = v;
std::cout << s.front() << " " << s.back() << "\n";
}ポインターとサイズから作成
生のポインターと要素数からspanを作成できます。C形式のバッファーを扱う場合に便利です。
#include <iostream>
#include <span>
int main() {
int buf[] = {10, 20, 30};
std::span<int> s(buf, 3);
std::cout << s[1] << "\n"; // 20
}spanの反復処理
spanは範囲ベースのforと、通常のコンテナーインターフェース(size、front、back、data)に対応しています。
#include <iostream>
#include <span>
int main() {
int buf[] = {2, 4, 6, 8};
std::span<int> s(buf, 4);
int sum = 0;
for (int x : s) sum += x;
std::cout << sum << "\n"; // 20
}読み取り専用span
std::span<const int>は読み取り専用アクセスを提供します。関数からデータを変更できないようにする場合に使用してください。
#include <iostream>
#include <span>
int main() {
int buf[] = {1, 2, 3};
std::span<const int> s(buf, 3);
std::cout << s[2] << "\n"; // 3
}spanを介した変更
constではないspanは、実際のデータを指しているため、基になる要素を変更できます。
#include <iostream>
#include <span>
int main() {
int buf[] = {1, 1, 1};
std::span<int> s(buf, 3);
for (int& x : s) x *= 10;
std::cout << buf[2] << "\n"; // 10
}動的エクステントと静的エクステント
spanのサイズはデフォルトでは動的ですが、std::span<int, 3>のようにコンパイル時に固定して、チェックを強化することもできます。
割り当て不要で、渡すのも軽量
すべてのビューと同様に、spanはコピーや値渡しのコストが小さく、ポインターと長さだけを保持します。
ライフタイムに注意
spanは、元のデータが存在し、再割り当てされない間だけ有効です。後から拡張されるvectorへのspanを保持しないでください。
理解度チェック
std::spanについての理解度を確認してください。
まとめ
std::spanの基本について学びました。
- 連続したデータ(配列、vector、生のバッファー)に対する所有権を持たないビューです。
- ポインターと長さを保持し、コピーや割り当ては発生しません。
constspanは読み取り専用で、変更可能なspanは元のデータを編集します。- 元のデータが存在する間だけ有効です。
よくある質問
「std::spanの基礎」レッスンは無料ですか?
はい。「std::spanの基礎」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、C++ Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 C++ Academyコースには全4レッスンが含まれています。
「std::spanの基礎」で何を学びますか?
連続データに対する非所有ビューです ブラウザで直接実行するハンズオンコードでC++ Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
C++ Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのC++ Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。
「std::spanの基礎」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このC++ Academyレッスンでコードを書いて実行できますか?
はい。すべてのC++ Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- 固定長std::array
- std::spanの基礎
- 関数へのspanの渡し方
- 範囲とサブスパン