0Pricing
C++ Academy · レッスン

string_viewを使う理由

文字列のコピーを避けます

「string_viewを使う理由」はCoddyKit上の無料C++ Academyレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはC++ Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 C++ Academyコースには全4レッスンが含まれています。

コピーのコスト

std::stringを値渡しすると、バッファー全体がコピーされます。読み取り専用のアクセスでは、このコピーは不要な処理です。std::string_viewは軽量な非所有ビューで、ポインターと長さだけを持ちます。<string_view>をインクルードしてください。

#include <iostream>
#include <string_view>
int main() {
    std::string_view sv = "hello";
    std::cout << sv << " len=" << sv.size() << "\n";
}

ビューが保持するもの

string_viewは、既存の文字列へのポインターと長さだけを保持します。データを所有したりコピーしたりすることはありません。

#include <iostream>
#include <string>
#include <string_view>
int main() {
    std::string s = "world";
    std::string_view sv = s; // views s, no copy
    std::cout << sv << "\n";
}

読み取り専用パラメーター

std::string_viewを受け取る関数は、コピーせずにstd::string、文字列リテラル、char配列を扱えます。

#include <iostream>
#include <string_view>
void greet(std::string_view name) {
    std::cout << "Hi, " << name << "\n";
}
int main() {
    greet("Ada");
    greet(std::string("Bob"));
}

アロケーションなし

ビューの作成でメモリが確保されることはないため、値としてコピーしたり渡したりしても低コストです。

#include <iostream>
#include <string_view>
int main() {
    std::string_view a = "constant text";
    std::string_view b = a; // trivial copy
    std::cout << (a == b) << "\n";
}

低コストな部分文字列

ビューに対するsubstrは同じメモリ内の別のビューを返すため、文字はコピーされません。

#include <iostream>
#include <string_view>
int main() {
    std::string_view sv = "abcdef";
    std::cout << sv.substr(2, 3) << "\n"; // cde
}

パフォーマンス上の意図を比較する

テキストを調べるだけの関数では、string_viewによってヒープ確保とコピーの両方を避けられます。これはホットループや解析処理で重要です。

長さとインデックス操作

ビューは、size()、empty()、インデックス操作、範囲ベースの反復など、使い慣れたインターフェースをサポートします。

#include <iostream>
#include <string_view>
int main() {
    std::string_view sv = "C++";
    for (char c : sv) std::cout << c << "-";
    std::cout << "\n" << sv.size() << "\n";
}

ビューは読み取り専用

string_viewを通して文字を変更することはできません。与えられるのは読み取りアクセスだけです。変更するには、所有している文字列が必要です。

リテラルからビューへ

文字列リテラルは直接ビューに変換できるため、定数テキストを非常に低コストで渡せます。

#include <iostream>
#include <string_view>
using namespace std::string_view_literals;
int main() {
    auto sv = "literal"sv;
    std::cout << sv.size() << "\n";
}

stringの代替ではない

テキストを所有、保存、変更する必要がある場合はstd::stringを使用します。一時的な読み取り専用パラメーターにはstd::string_viewを使用します。

ライフタイムに関する注意

ビューはデータを所有しないため、参照先の文字列はビューより長く存続する必要があります。これを誤るとダングリングビューが発生します。詳しくは後のレッスンで扱います。

理解度チェック

string_viewが必要とされる理由についての理解度を確認しましょう。

まとめ

string_viewが存在する理由について学びました。

  • 所有権を持たない、ポインターと長さによるビューです。
  • これを受け取ることで、読み取り専用テキストのコピーとメモリ確保を避けられます。
  • 文字列、リテラル、char配列を扱えます。
  • ビューが参照するデータは、ビューより長く存続する必要があります。

よくある質問

「string_viewを使う理由」レッスンは無料ですか?

はい。「string_viewを使う理由」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、C++ Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 C++ Academyコースには全4レッスンが含まれています。

「string_viewを使う理由」で何を学びますか?

文字列のコピーを避けます ブラウザで直接実行するハンズオンコードでC++ Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

C++ Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのC++ Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。

「string_viewを使う理由」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このC++ Academyレッスンでコードを書いて実行できますか?

はい。すべてのC++ Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

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

  1. string_viewを使う理由
  2. ビューの作成
  3. 落とし穴とライフタイム
  4. 文字列アルゴリズム
← C++ Academyに戻る