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フィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- string_viewを使う理由
- ビューの作成
- 落とし穴とライフタイム
- 文字列アルゴリズム