Qt の QString クラスや Python 文字列と比較して、C++ 標準ライブラリのstd::string
クラス (またはより一般的にはstd::basic_string
クラス テンプレート) に、大文字、部分文字列の置換、トリミングなどの通常の文字列機能がない理由を知っている人はいますか?
3 に答える
これに突っ込みます…。
テンプレートstd::basic_string
はもともとSTLに記述され、含まれていました。STL は、私たちが知っている標準ライブラリの「抽象的な」部分 (コンテナー、イテレーター、アルゴリズム、アロケーターなど) を表しています。これも含まれていstd::string
ます。
STLにはエンコーディング、国際化、ロケール依存の機能がまったくないことに注意してください。それは設計上の目標ではありませんでした。
前の世代の出来事についての私の見解: C++ が標準化されたとき、包括的な標準ライブラリが必要でした。STL はこれに非常に適していて、ほぼそのまま引き継がれました。後になって初めて、のようなものが<iostream>
追加<locale>
されました。ストリームと文字列の間のぎこちなく、非常に一貫性のないインターフェイスの違いは、この「すべてを一緒に投げよう」という態度を証明するだけです。
多くのstd
施設と同様に、コンポーネント間の相互運用は最適化されていませんでした。その上、既存の C 機能 ( などtoupper
) をラップする小さな C++ 関数の単純さが、これを標準ライブラリに含めない理由として使用されています。
標準 (および標準に含まれるライブラリ) の次の改訂までに、下位互換性により、有用で必要な変更 (機能にロケールを挿入std::string
する) が追加されなくなりました。
この推測は、たとえばstd::trim
文字列の取得とロケール オブジェクトが追加されなかった理由をまったく説明していないことに注意してください。関連するバックグラウンドプロセスを説明する試みのようなものです。
すべてが述べられたので、C++ 標準ライブラリが扱いにくく、一般的な有用性が不完全であることに完全に同意します。
更新: タイムラインが逆になっていると通知されました。標準ライブラリ (および iostream) は、STL が追加される前に存在していました。ただし、上記の点は依然として有効です。STL はコピー アンド ペーストされており、統合はほとんどまたはまったくありません (単純な例: 最近まで欠落していたものstd::basic_istream<T>::open(const std::basic_string<T>&)
で、次のイテレーションでstd::filesystem
スタッフが原因で廃止される予定です)。
不足しているすべての機能について、一般的な意味でお答えすることはできませんが…</p>
トリミングと大文字の 2 つの機能は、ロケールに依存します。それらは文字の機能だけでなく、使用されているエンコーディングと言語でもあります。
std::string
本当にそれを処理しません。実際には、誰もが ASCII で定義されている空白を含む Unicode を使用していますが、C++ を定義する種類の標準化プロセスには一般的ではありません。
このような操作は、ストリーム (たとえば、std::stringstream
余分なスペースを削除するために から読み取る) とロケール オブジェクト (たとえば、 を介してアクセスするstd::tolower
) によって取得されます。
機能が悪い?標準ライブラリの肥大化したコンポーネントの 1 つと見なされます。sで動作するアルゴリズムの完全なセットstd::string
、すべての標準アルゴリズムがあります。メンバー関数に限定しないでください。インターフェイスにはそれ以外にも多くの機能があります...