1. ホーム
  2. c++

[解決済み】string_viewとは何ですか?

2022-04-11 02:09:37

質問

string_view は、C++ Library Fundamentals TSの中で提案された機能です( N3921 ) がC++17に追加されました。

私が理解する限り、これはある種の文字列 "概念" を表す型であり、文字列として表示可能な何かを格納できる任意のタイプのコンテナのビューです。

  • これで良いのでしょうか?
  • カノニカルの const std::string& パラメータタイプは string_view ?
  • について、もう一つ重要な点はありますか? string_view を考慮する必要がありますか?

解決方法は?

文字列参照や配列参照を提案する目的は、すでに他の場所にあり、変異しないビューだけが必要なデータをコピーすることを避けるためです。そのため string_view という提案もありましたが、今回はその一つです。 string_refarray_ref も、そうです。

アイデアは常に、最初の要素へのポインタと、いくつかの 既存 のデータ配列または文字列です。

このようなビューハンドルクラスは、値によって安価に渡すことができ、安価なサブストリング操作(単純なポインタの増分とサイズ調整として実装可能)を提供することができる。

文字列の多くの用途では、実際に文字列を所有する必要はなく、問題の文字列はすでに他の誰かに所有されていることがよくあります。そのため、不要なコピーを避けることで効率を上げることができる可能性があります(すべての割り当てと例外を節約できることを考えてみてください)。

オリジナルの C 言語文字列は、ヌルターミネータが文字列 API の一部であったため、基礎となる文字列を変更せずに部分文字列を簡単に作成できないという問題に悩まされていました (たとえば strtok ). C++では、長さを別々に保存し、ポインタとサイズを1つのクラスにラップすることで簡単に解決できます。

C++標準ライブラリの哲学から乖離し、大きな障害となっているのは、このような "参照ビュー" クラスが、標準ライブラリの他の部分とは全く異なる所有権セマンティクスを持っているということです。基本的に、標準ライブラリの他のすべては、無条件に安全で正しい(コンパイルできれば正しい)ものです。このような参照クラスでは、それはもはや真実ではありません。プログラムの正しさは、これらのクラスを使用するアンビエントコードに依存するのです。だから、それをチェックするのも教えるのも難しくなる。