web-dev-qa-db-ja.com

std :: stringはSTLの一部ですか?

(STLと言うときは、コンテナー、イテレーター、アルゴリズム、およびファンクターを中心に展開するテンプレートライブラリについて話します。)
この質問は、std::stringが通常のコンテナのように動作し、begin関数とend関数(イテレータを含む)、size関数と、イテレータを介してコンテナ/範囲で機能する通常のSTLアルゴリズム(例:transformsortfindなど)にこれらすべてを使用する可能性。 )。

ただし、同時に、任意のデータを格納するコンテナーの図に収まらないため、コンテナー自体ではありません。また、含まれているデータは主にsubstrfind_first_ofなどのメンバー関数を介して動作しますが、実際のコンテナーはそれを行わず、アルゴリズムに処理させます。

さらに、 cplusplusリファレンスサイト およびC++標準では、実際のコンテナと一緒にstd::stringがリストされていませんが、別個のカテゴリにリストされています。
ただし、 SGIのSTLサイト では、basic_string(したがってstring typedef)が他のコンテナーと basic_string参照サイト 「コンテナ」カテゴリに属する​​ことを示します。

さて、私の質問は、stringは実際にはSTLの一部なのか、それとも別個のライブラリ自体なのかということです。
そして、それが現在STLに属している場合、Stepanovによって開発された元のSTLとは異なりましたか?

36
Xeo

いいえ、そうではありません。はい、そうです。

「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は引き続き使用され、おそらく無期限にそうします(そして通信を妨害し続けます)。

11
Jerry Coffin

それは確かにSTLの一部です。そして、std :: stringはbasic_stringtypedefです。これはコンテナであり、文字列セマンティクスを使用したデータストレージ用に特化されています(c ++の「特殊化」の意味ではありません:))。しかし、ステパノフについてはわかりません。言及する価値があるのは、STLがコンテナサブパートだけでなく「標準テンプレートライブラリ」であることです。これには、アルゴリズム、ストリーム、およびいくつかの特性が含まれます。

2