C++ の文字列ビュー

C No Wen Zi Liebyu



C++ プログラミングの分野では、効率とパフォーマンスを優先することが非常に重要です。 C++17 で導入された「std::string_view」クラスは、従来の文字列操作に代わる多用途でメモリ効率の高い代替手段を提供します。その核心となる「std::string_view」は、文字シーケンスへの非所有参照であり、通常はより大きな文字列の部分文字列を表します。データを所有し内部でメモリを管理する「std::string」とは異なり、「std::string_view」は基礎となるデータを所有せずに動作します。この特性により、メモリのコピーや管理のオーバーヘッドが望ましくないシナリオで特に価値があります。この記事では、C++ での「std::string_view」の使用法を理解するためにさまざまな例を検討します。

例 1: 効率的な文字列処理

最新の C++ 開発では、パフォーマンスとリソース使用率を最適化するために効率的な文字列処理が重要です。これにより、メモリの再割り当てや重複を必要とせずに、文字列への効率的なアクセスと操作が可能になります。この概念を説明するために、実際の例を詳しく見てみましょう。







次のコード スニペットを考えてみましょう。



#include
#include <文字列ビュー>

void processStringView ( std::string_view strView ) {

std::cout << '長さ: ' << strView.length ( ) << std::endl;
std::cout << 'コンテンツ: ' << strView << std::endl;
}

整数メイン ( ) {

std::string オリジナル文字列 = 「効率的な文字列処理」 ;

std::string_view viewOfString ( 元の文字列 ) ;

プロセス文字列ビュー ( viewOfString ) ;

戻る 0 ;
}


この例では、「std::string_view」をパラメータとして受け取る「processStringView」関数があります。次に、関数は標準出力を使用して文字列ビューの長さと内容を出力します。 main 関数は、「originalString」という名前の「std::string」を「効率的な文字列処理」値で初期化します。続いて、「originalString」の内容を参照して、「viewOfString」という名前の「std::string_view」が作成されます。



「viewOfString」を「processStringView」関数に渡すことで、文字列に対する操作を効率的に実行でき、追加のメモリ割り当ての必要がなくなります。 「std::string_view」は、データをコピーせずに、「originalString」の基礎となる文字シーケンスへの軽量の参照です。





生成された出力は次のとおりです。



例 2: 従来のコードとの相互運用性

C++ 開発の分野では、新しいコードベースと古いコードベースのシームレスな統合が重要な懸案事項となることがよくあります。 「std::string_view」を使用すると、開発者は「const char」ポインタを返す従来の関数と簡単に対話できるようになります。

相互運用性を実現するための「std::string_view」の実際の使用法を示す次の例を考えてみましょう。ここには、「const char」ポインタを返す「legacyFunction()」という名前のレガシー関数があります。

#include
#include <文字列ビュー>

定数文字 * レガシー関数 ( ) {
戻る 「レガシーストリング」 ;
}

整数メイン ( ) {

std::string_view レガシーStrView ( レガシー関数 ( ) ) ;

std::cout << 「従来の文字列ビュー:」 << レガシーStrView << std::endl;

戻る 0 ;
}


まず、「legacyFunction()」という名前のレガシー関数を定義します。この関数は、「Legacy String」というラベルが付けられた文字列を表す「const char」ポインタを返します。このレガシー データを最新の C++ プログラムにシームレスに組み込むために、「std::string_view」を採用しています。具体的には、main() 関数で、「legacyStrView」という名前の「std::string_view」のインスタンスを作成し、レガシー関数の結果で初期化します。このインスタンス化により、従来の「const char」ポインタを効率的にカプセル化して操作できるようになります。

その結果、不必要なデータのコピーに頼ることなくレガシー文字列にアクセスして操作できるようになり、効率と互換性の両方が維持されます。コードの最後のステップでは、「std::cout」を利用して従来の文字列ビューのコンテンツを出力します。

実行された出力は次のとおりです。

例 3: 文字列リテラルの処理の改善

C++ の文字列リテラルは伝統的に文字の配列として表されます。 「std::string_view」は、便利なインターフェイスを提供することで文字列リテラルの操作を簡素化します。 「std::string_view」は、明示的な変換を必要とせずに基になる文字配列に直接アクセスできるようにすることで、文字列リテラルの操作を効率化します。

#include
#include <文字列ビュー>

整数メイン ( ) {
定数文字 * myリテラル = 「こんにちは、ストリングビュー!」 ;
std::string_view リテラルビュー ( 私のリテラル ) ;

std::cout << 「最初の文字:」 << リテラルビュー [ 0 << std::endl;

size_t 位置 = リテラルビュー.find ( '弦' ) ;
std::cout << 「部分文字列の位置:」 << 位置 << std::endl;

戻る 0 ;
}


この例では、「Hello, String View!」文字列リテラルは「myLiteral」ポインタに割り当てられます。 「std::string_view」の導入により、内容をコピーする必要がなく、この文字列をより効率的に表現できるようになります。 「literalView」オブジェクトは「myLiteral」ポインタを使用して作成され、これにより基礎となる文字シーケンスを表示および操作できるようになります。

「std::string_view」を使用すると、文字列内の個々の文字に簡単にアクセスできます。コード スニペットでは、「literalView[0]」が文字列の最初の文字を取得して出力し、要素へのアクセスの単純さと直接性を示しています。 「std::string_view」の「find」メソッドは、元の文字列内の「String」部分文字列の位置を決定するために使用されます。

例 4: 部分文字列の抽出

部分文字列抽出のタスクには、区切り文字の位置などの指定された基準に基づいて、指定された文字列の一部を取得することが含まれます。部分文字列を簡単に抽出できる機能は、「std::string_view」の強力な機能です。区切り文字に基づいて文字列の一部を抽出する必要があるシナリオを考えてみましょう。

#include
#include <文字列ビュー>

整数メイン ( ) {
std::string フル文字列 = 「リンゴ・オレンジ・バナナ」 ;
size_t delimiterPos = fullString.find ( 「-」 ) ;

std::string_view subString = fullString.substr ( 0 、区切り文字の位置 ) ;

std::cout << 「抽出された部分文字列:」 << 部分文字列 << std::endl;

戻る 0 ;
}


このコード スニペットでは、元の文字列「fullString」の宣言から始めます。これは、「apple-orange-banana」値で初期化されます。私たちの目標は、部分文字列の抽出を実行することです。これを実現するために、C++ 標準ライブラリによって提供される「find」関数を使用します。

「delimiterPos」変数に格納されている「fullString」内の区切り文字の位置を特定したら、必要な部分文字列を抽出します。 「substr」関数は元の文字列に対して呼び出され、開始位置 (0) と、正確に区切り文字の位置である部分文字列の長さを指定します。この操作により、元の文字列の先頭から区切り文字までの部分を表す「subString」という名前の「std::string_view」が作成されます。

例 5: メモリ効率の高いデータ構造

「std::string_view」は、メモリ効率の高いデータ構造を設計する上で重要な役割を果たします。文字列の複数のコピーを保存する代わりに、データ構造は「std::string_view」インスタンスを保存できるため、メモリのオーバーヘッドが削減されます。

#include
#include <文字列ビュー>

構造体レコード {
std::string_view 名;
年齢;
} ;

整数メイン ( ) {

記録者= { 'ジョン・ドウ' 30 } ;

std::cout << '名前: ' << 人名 << '、 年: ' << 人物 << std::endl;

戻る 0 ;
}


このコード スニペットでは、メモリ効率の高いデータ構造内での「std::string_view」の使用法を紹介します。 「name」という名前の「std::string_view」メンバーと「age」という名前の整数メンバーで構成される「Record」構造を定義します。このコンテキストで「std::string_view」を使用すると、追加のメモリ割り当てを必要とせずに、文字列の軽量表現を作成できます。

「main」関数では、名前「John Doe」、年齢 30 歳の「person」という名前の「Record」オブジェクトをインスタンス化します。「std::string_view」メンバーの「name」は、名前に対応する文字データを取得するため、文字列の内容を複製する必要がなくなります。 「std::cout << '名前: ” << person.name << '、年齢: ” << person.age << std::endl;」このステートメントは、「Record」オブジェクトに格納されている人物の名前と年齢を出力します。

結論

進化し続ける C++ 開発環境の中で、「std::string_view」はプログラマのツールキットへの貴重な追加機能として際立っています。この記事で説明されているインスタンスは、C++ プログラミングの領域における「std::string_view」の適応性と有用性を強調しています。効率的な文字列操作や従来のコードとのシームレスな相互運用性からメモリ効率の高いデータ構造に至るまで、「std::string_view」は、さまざまなシナリオでパフォーマンスの向上と最適化されたコードを求める開発者にとって価値があります。これらの実際のシナリオは、「std::string_view」がどのようにコードを最適化し、不必要なメモリ オーバーヘッドを削減し、C++ アプリケーションの全体的な効率に貢献できるかを示しています。