0Pricing
C++ Academy · レッスン

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、生のバッファー)に対する所有権を持たないビューです。
  • ポインターと長さを保持し、コピーや割り当ては発生しません。
  • const spanは読み取り専用で、変更可能な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フィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. 固定長std::array
  2. std::spanの基礎
  3. 関数へのspanの渡し方
  4. 範囲とサブスパン
← C++ Academyに戻る