(STLと言うときは、コンテナー、イテレーター、アルゴリズム、およびファンクターを中心に展開するテンプレートライブラリについて話します。)
この質問は、std::string
が通常のコンテナのように動作し、begin
関数とend
関数(イテレータを含む)、size
関数と、イテレータを介してコンテナ/範囲で機能する通常のSTLアルゴリズム(例:transform
、sort
、find
など)にこれらすべてを使用する可能性。 )。
ただし、同時に、任意のデータを格納するコンテナーの図に収まらないため、コンテナー自体ではありません。また、含まれているデータは主にsubstr
、find_first_of
などのメンバー関数を介して動作しますが、実際のコンテナーはそれを行わず、アルゴリズムに処理させます。
さらに、 cplusplusリファレンスサイト およびC++標準では、実際のコンテナと一緒にstd::string
がリストされていませんが、別個のカテゴリにリストされています。
ただし、 SGIのSTLサイト では、basic_string
(したがってstring
typedef)が他のコンテナーと basic_string
参照サイト 「コンテナ」カテゴリに属することを示します。
さて、私の質問は、string
は実際にはSTLの一部なのか、それとも別個のライブラリ自体なのかということです。
そして、それが現在STLに属している場合、Stepanovによって開発された元のSTLとは異なりましたか?
いいえ、そうではありません。はい、そうです。
「STL」にはさまざまな定義があります 以下を含みます:
実際のHP/SGI STL、元のライブラリ、その一部はC++標準ライブラリのベースになっています。それらには、コンテナー、イテレーター、およびアルゴリズムが含まれていました。文字列はこの一部ではありませんでした。
SGISTLライブラリに基づいたC++標準ライブラリの部分:コンテナ、イテレータ、およびアルゴリズム。まだ文字列はありません。
すべてのC++標準ライブラリ。この定義は、論理や現実にまったく根拠がありませんが、従うと、std::string
が含まれます。
実際のSTLは、C++が標準化されてから開発され(約13年前、覚えておいてください)、文字列など、標準化されたもののいくつかを逆に採用していることに注意してください。これはnotは、元々1998年に存在したことを意味しません...しかし、「互換性」の理由で現在存在しています。
概要
STLは、コンテナー、アルゴリズム、およびイテレーターでした。
文字列とストリームはC++ 98に採用され、次にbackwards-最新のSGISTLに採用されました。
文字列が「STLの一部」であるかどうかは、論理と理由に従うか、標準ライブラリを「STL」と呼ぶかによって異なります。
お役に立てれば。
これに対する本当の答えはありません。一方では、 std::string
は他のコンテナから完全に独立して開発されました。一方、ランダムアクセスコンテナのすべての要件を満たすのに十分な数が追加されています。それを「STL」の一部として分類するかどうかは完全にあなた次第です。結局のところ、「STL」には単一の合意された定義がないという事実と、突然の可能性を示しているにすぎません。明確な意味を得るのは遠いです(うまく言えば)。
IOW、「STL」は、人々が少なくとも3つの異なる意味で使用するため、使用するのはお粗末な略語です。ただし、残念ながら、より明確な意味を持つより良い略語はありません。そのため、STLは引き続き使用され、おそらく無期限にそうします(そして通信を妨害し続けます)。
それは確かにSTLの一部です。そして、std :: stringはbasic_stringtypedefです。これはコンテナであり、文字列セマンティクスを使用したデータストレージ用に特化されています(c ++の「特殊化」の意味ではありません:))。しかし、ステパノフについてはわかりません。言及する価値があるのは、STLがコンテナサブパートだけでなく「標準テンプレートライブラリ」であることです。これには、アルゴリズム、ストリーム、およびいくつかの特性が含まれます。