web-dev-qa-db-ja.com

「STL」と「C ++標準ライブラリ」の違いは何ですか?

誰かが この記事(私は言い換えています)という主張に注意を向けましたSGI STLから取得した部分ではなく、C++標準ライブラリ。

(...)STL(SGIで設計された)を使用している人はほとんどいないにもかかわらず、「STL」を指します。

C++標準ライブラリの一部はSTLの一部に基づいていたため、多くの人(複数の著者やエラーで有名なcplusplus.comを含む)が依然として「STL」と呼んでいるのはこれらの部分です。ただし、これは不正確です。実際、C++標準では「STL」に言及することはなく、2つのコンテンツの違いがあります。

(...)SGI STLに基づいているstdlibのビットを指すために「STL」が使用されることはほとんどありません。人々はそれが標準ライブラリ全体だと考えています。 CVに配置されます。そしてそれは誤解を招く。

私はC++の歴史についてほとんど何も知らないので、記事の正しさを判断することはできません。 STLという用語の使用は控えるべきですか?または、これは孤立した意見ですか?

407
Pieter

"STL" アレクサンダーステパノフによって書かれた C++が標準化されるずっと前の日。 C++は80年代を通じて存在していましたが、現在「 C++ 」と呼ばれているのは、ISO/IEC 14882:2014(およびISO/IEC 14882:2011などの以前のバージョン)で標準化された言語です。

STLはすでにC++のライブラリとして広く使用されており、プログラマーがコンテナ、イテレータ、アルゴリズムにアクセスできるようにしています。標準化が行われたとき、言語委員会はparts ofC++ Standard Library(これは言語標準の一部です)をveryに設計しましたSTLにほぼ一致します。

長年にわたって、著名な本の著者やさまざまなWebサイトを含む多くの人々が、2つのエンティティが別々であり、いくつかの違いがあるにもかかわらず、C++標準ライブラリを「STL」と呼んでいます。これらの違いは、さまざまな機能を含み、一部のクラスを大幅に変更する新しいC++標準でさらに顕著になります。

元のSTLは、Microsoft Visual StudioまたはGCCがC++標準ライブラリの実装を出荷するのと同じ方法で、「C++標準テンプレートライブラリの実装」と呼ばれることが多くなります(実際の履歴に逆戻りします!)。ただし、「標準テンプレートライブラリ」と「標準ライブラリ」は同じものではありません。

戦いは、現在の標準ライブラリの全体または一部を「STL」と呼ぶべきか、および/またはそれが何と呼ばれるかが重要かどうかについてです。

「STL」の場合

「STL」が標準ライブラリを意味することを誰もが知っていると言う考え方があります。「C++」がISO標準言語であることを誰もが知っているように。

また、すべての関係者が何について話しているかを理解している限り、それは実際には問題ではないと信じる人々も含まれます。

これは、獣の性質によってさらに一般的になった用語であり、その多くは「テンプレート」として知られるC++機能を多用しています。

「C++標準ライブラリ」(またはstdlib)の場合

しかし、私が購読している別の考え方があり、これは混乱を招くと言っています。 C++を初めて学習する人はこの区別を知らないため、言語の小さな違いに気付かない場合があります。

その記事の著者は、C++標準ライブラリ全体がSTLであり、STLの一部ではない機能を含むであると信じる人々と何度も出会いました。対照的に、「STL」のほとんどの声の支持者は、それが何を意味するかを正確に知っており、誰もが「理解する」わけではないと信じることを拒否します。明らかに、用語の使用法は均一ではありません。

さらに、実際にはC++標準ライブラリではなく、元のSTLの実装であるSTLライクなライブラリがいくつかあります。最近まで、 STLPort はそれらの1つでした(さらには 混乱 がたくさんあります!)。

さらに、C++標準には「STL」というテキストは含まれておらず、「STLはincludedin C++ Standard Library」のようなフレーズを習慣的に使用している人もいます。

このように用語の使用を広め続けると、誤解が永遠に続くだけだと私は信じています。悲しいことに、たとえそれがより良いものであると想定されていたとしても、物事を変えることを試みることは完全に非生産的かもしれません。永遠に二重の意味に固執するかもしれません。

結論

この投稿が少し偏っていたことに感謝します。リンク先の記事を書きました。 :)とにかく、これが戦いを少し良く説明するのに役立つことを願っています。

2011年4月13日更新

C++標準ライブラリ全体を参照するために「the STL」を使用している人の threeperfectexamples です。毎日のように見るのが明白なとき、多くの人が盲目だと誓うので、誰もこれをやらないと私を困惑させ続けています。

本当に正しい答えはありません。 Alexander Stepanovは、STL(当時HPで働いていた)と呼ばれるライブラリを開発しました。そのライブラリは、C++標準に含めるために提案されました。

それは基本的に「分岐」開発です。委員会はいくつかの部分を含め、他の部分を完全に拒否し、いくつかを再設計しました(アレクサンダーの参加により)元のライブラリの開発は後にSilicon Graphicsに移行されましたが、C++標準ライブラリとは別に継続されました。

これらのピースが標準ライブラリに追加された後、標準ライブラリの他の一部が追加されたものに合うように変更されました(たとえば、beginendrbegin、およびrendstd::stringに追加され、コンテナーのように使用できるようになりました)。ほぼ同時期に、ライブラリのmost(完全にだった部分も(無関係)は、さまざまなタイプ(標準ストリームなど)に対応するためにテンプレート化されました。

一部の人々は、STLを「標準ライブラリ」の短い形式としても使用しています。

つまり、誰かが「STL」という用語を使用する場合、約半ダースの異なるもののいずれかを指している可能性があります。良くも悪くも、それを使用するほとんどの人は意味の多様性を無視し、他のすべての人が自分が参照しているものを認識すると仮定しているようです。これは多くの誤解につながり、参加者のほとんどがまったく異なることについて話していたので、参加者のほとんどを愚かに見せた少なくともいくつかの深刻な火炎戦争につながります。

残念ながら、混乱は衰えることなく続きそうです。 「コンテナ、イテレータ、およびC++標準ライブラリのアルゴリズムのようなものよりも「STL」を参照する方がはるかに便利ですが、コンテナのように動作する場合でもstd::stringは含まれません。」 「C++標準ライブラリ」はそれほど長くて不器用ではありませんが、「STL」はまだずっと短くてシンプルです。誰かがより正確な用語を発明するまで(必要な場合)、andと同じくらい便利である限り、「STL」が引き続き使用され、混乱が続きます。

81
Jerry Coffin

「STL」または「標準テンプレートライブラリ」という用語は、ISO 14882 C++標準のどこにも表示されません。そのため、C++標準ライブラリをSTLと呼ぶのは間違っています。 「C++標準ライブラリ」または「標準ライブラリ」という用語は、ISO 14882で公式に使用されているものです。

ISO 14882 C++標準:

17-ライブラリの紹介[lib.library]:

  1. この節では、C++標準ライブラリの内容、整形式C++プログラムがライブラリを利用する方法、および準拠する実装がライブラリ内のエンティティを提供する方法。

...

STLは元々Alexander Stepanovによって設計されたライブラリで、C++標準とは無関係です。ただし、C++標準ライブラリの一部のコンポーネントには、vectorlistなどのSTLコンポーネント、およびcopyおよびswapなどのアルゴリズムが含まれています。

しかし、もちろんC++標準にはSTL以外にも多くのものが含まれているため、「C++標準ライブラリ」という用語はより正確です(そして実際に標準ドキュメントで使用されているものです)。

47
In silico

私は最近、これと同じ議論をしましたが、少しの寛容は許されると信じています。 Scott Meyers が同じ間違いをした場合、あなたは良い仲間です。

22
Mark Ransom

GNU標準C++ライブラリ(libstdc ++)FAQ から:


STL(標準テンプレートライブラリ)は、C++標準ライブラリの大部分のインスピレーションでしたが、用語は互換性がなく、同じことを意味するものではありません。 C++標準ライブラリには、STLに由来しない多くのものが含まれており、それらの中にはstd::localestd::threadなどのテンプレートではないものもあります。

Libstdc ++-v3には、 SGI STL (最終マージは リリース3. )からの多くのコードが組み込まれています。 libstdc ++のコードには、元のSGIコードと比較して多くの修正と変更が含まれています。

特に、stringはSGIのものではなく、 "rope"クラスを使用しません(ただし、オプションの拡張機能として含まれています)。valarrayも他のものもありません。 vector<>のようなクラスはSGIからのものでしたが、大幅に変更されました。

Libstdc ++の進化の詳細については、 API evolution および 後方互換性 のドキュメントをご覧ください。

SGIのSTLの FAQ を読むことをお勧めします。


参考までに、2018年3月現在、公式のSTL Webサイトでさえ www.sgi.com/tech/stl/はなくなっています

1
vstepaniuk