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


446

誰かがもたらしたこの記事をクレームはというのが私の注意に(私は言い換えだ) STL項は全体のC ++標準ライブラリの代わりに、SGIのSTLから採取された部分を参照するために悪用されています。

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

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

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

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


62
人々は物事を説明するために良い名前が必要です。ステパノフの天才は私たちがプログラムする方法を変えました。「標準ライブラリプログラミング」のような名前は、それを説明するのにまったく役に立ちません。それを「stlプログラミング」と呼ぶと、誰もがあなたの意味を知っています。それについて議論することは、要点を逃しているだけです。良い名前が必要です。
ハンスパッサント2011年

34
@ハンス:いいえ、あなたは要点逃します:「誰もがあなたの意味を知っている」は真実ではありません
オービットの

16
どういう意味かわかりません。
ハンスパッサント2011年

21
これは、「STL」を使用してC ++標準ライブラリ全体を参照している人の完全な例です。ほとんど毎日のように見ているのが明白なとき、多くの人々が盲目を誓うので、誰もこれをしていません。
オービットの軽量レース、

回答:


571

"STL" 、C ++が標準化されるずっと前に、Alexander Stepanovによって書かれました。C ++は80年代まで存在していましたが、現在「C ++」と呼ばれているのは、ISO / IEC 14882:2014(および以前のバージョン(ISO / IEC 14882:2011など))で標準化された言語です。

STLはすでにC ++のライブラリとして広く使用されており、プログラマーがコンテナー、イテレーター、アルゴリズムにアクセスできるようにしています。標準化が起こった場合には、言語委員会は、設計されたの部分する(言語標準の一部である)C ++標準ライブラリを非常に密接にSTLと一致します。

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

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

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

「STL」の場合

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

また、すべての関係者が話していることを理解している限り、それはそれほど重要ではないと考える人々も含まれます。

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

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

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

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

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

さらに、C ++標準には「STL」というテキストはどこにも含まれておらず、「STL はC ++標準ライブラリに含まれている」などのフレーズを日常的に使用している人もいますが、これは間違いです。

このように言葉の用法を広め続けることは、誤解が永遠に続くことになると私は信じています。悲しいかな、より良いものになるはずだとしても、物事を変えようとすることは完全に逆効果になるかもしれません。永遠に二重の意味で立ち往生しているだけかもしれません。

結論

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

2011年4月13日更新

以下は、「STL」を使用してC ++標準ライブラリ全体を参照している人の3つの 完璧な です。ほとんど毎日のように見ているのが明白なとき、多くの人々が盲目を誓うので、誰もこれをしていません。


136
S tandard T emplate Lの ibraryのみで作成されていないセント epanovとLの EEが、彼らはまたで働いていたS oftware T echnologyのLの時aboratory。
Kragen Javier Sitaker

21
今日、ヘッダーstd::iotaを機能させることができなかったため、ヘッダーが何であるかを誰かに尋ねました。これはSGIの非標準の拡張機能であり、「STL」であるため「標準」と呼ばれ、「STL」がC ++標準ライブラリの一部であることは誰もが知っていますよね。また、C ++ 0xで導入されましたが、C ++ 03では使用できません。Grrr。
オービットの軽さのレース'23年

40
そして、MSのSTLはによって維持されているS tephan TL avavej、別名STL。
ミハエラ


26
Bjarne Stroustrupは、「キャノン」C ++プログラミング言語第4版の標準ライブラリの他の部分とSTLを明確に区別しています。
codenheim 2014

84

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

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

これらの作品は、標準ライブラリに追加された後、標準ライブラリのいくつかの他の部分は、より良いを加えたものに合うように修正された(例えば、beginendrbeginおよびrendに追加されたstd::stringことは、コンテナのように使用することができるよう)。ほぼ同じ時期に、ライブラリのほとんど完全に無関係なものも含む)は、さまざまなタイプ(たとえば、標準ストリーム)に対応するためにテンプレートにされました。

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

つまり、誰かが「STL」という用語を使用する場合、それらは約6種類の異なるもののいずれかを指している可能性があります。良くも悪くも、それを使用するほとんどの人々は意味の多様性を無視しているようであり、他の誰もが彼らが言及していることを認識すると思います。これは多くの誤解につながり、参加者のほとんどがまったく異なることについて話しているだけだったので、参加者のほとんどが愚かに見えた少なくともいくつかの深刻な炎の戦争。

残念ながら、混乱は衰えることなく続きそうです。「C ++標準ライブラリのコンテナ、イテレータ、アルゴリズムなど」よりも「STL」を参照する方がはるかに便利std::stringですが、コンテナのように機能することはできますが、は含まれません。「C ++標準ライブラリ」はそれほど長くて不格好ではありませんが、「STL」はまだずっと短くて単純です。まで、または(必要な時)より正確な、ある誰かを発明する条項がない限りちょうど便利なよう、「STL」が使用され続けると混乱が発生していきます。


5
@ジェリー:前者; これが「std」の意味です。:)
軌道の軽さのレース

6
@ジェリー:名前空間がどこに入るのかわからない。準拠した実装では、名前空間に何も追加されませんstd。私は「標準」を表す「stdlib」の「std」について話していました。それが何を意味するかはかなり明確だと思います!
オービットでの軽さのレース

3
@ジェリー:私は誰かが形容詞「標準」を「これは標準にある」と読むことを期待するのは一続きではないと思います。一方、17.4.3.1 / 1では、名前空間への追加stdはUBであることは明らかです。特定の名前付きの場合を除きます。これらの追加の場合は標準で名前が付けられているため、完全に準拠しています。「標準」は引き続き適用されます。
オービットのライトネスレース2011年

1
ここのSGIとHPの歴史は逆です。ステパノフはSGIに入る前にHPにいました。
Kragen Javier Sitaker、2011年

2
私はここのコメントを読み直し、もう1つ(確かにマイナー)ポイントを追加する価値があると思いました。「標準」が常に「標準にある」ことを意味することを期待するのは少しストレッチだと思います。特に、多くのC ++プログラマ、標準が登場するずっと前から「標準ライブラリ」というフレーズを使用していました。彼らがC標準のライブラリを参照していたとは思わないかもしれませんが、C標準が(ドラフトでさえ)ある前に、Cプログラマーにも同じことが当てはまりました。
Jerry Coffin

52

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

ISO 14882 C ++標準:

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

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

...

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

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


5
+1。ただし、STLにはstd名前空間(IIRC)はありませんでした。
オービット

1
当時、ほとんどのC ++コンパイラは名前空間を実装していませんでした。実際、それらが標準にあったかどうかはわかりません。
Kragen Javier Sitaker

3
@クラーゲン:まあ、標準はありませんでした。
軌道の軽さの競争2009年

3
ああ。まあ、Stroustrupの本は何冊かありましたが、まったく同じではないでしょうか。
Kragen Javier Sitaker、2011年

23

私は最近、これと同じ議論をしましたが、少しの許容差は許容できると思います。場合はスコット・マイヤーズは、同じ間違いを犯し、あなたは良い会社にしています。


@Tomalak&@Mark:実際、スコットはそうで-1はありません。この本は確かに「Stepanovのライブラリに由来するstd libの一部」という意味でのSTLに関するものです。時間をかけて本の目次に目を通してください。私が見つけることができた元のSTLの外の唯一のものはstd::stringであり、それは本格的なSTLコンテナーになるように装備されていました。
sbi

@sbi:あなたは明らかに私の立場を誤解している。Scottのように "STL"を使用しません。私の答えを読んでください。
オービットのライトネスレース2011年

6
@Tomalak、私はそのような方法でも "STL"を使用しませんが、私はおそらく過去に罪を犯したことがあります。私はそれが人々を打ち負かす価値があるとは思いません。
Mark Ransom

1
尊敬できること。潜在的なあいまいさをまったく認めない人たちについて、私は最も苛立ちます。:)
軌道の軽さのレース

11
また、Bjarne Stroustrupと一緒にいることになります-参照。例えば。stroustrup.com/DnE2005.pdf:「STL(「標準テンプレートライブラリ」;つまり、ISO C ++標準ライブラリのコンテナとアルゴリズムフレームワーク)」
Sander De Dycker '11

7

GNU標準C ++ライブラリ(のlibstdc ++)よくある質問


STL(標準テンプレートライブラリ)は、C ++標準ライブラリの大きなチャンクのインスピレーションでしたが、これらの用語は互換性がなく、同じ意味ではありません。C ++標準ライブラリはSTLから来なかった事の多くを含み、そのうちのいくつかは、次のようなさえテンプレート、ではないstd::localestd::thread

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

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

libstdc ++の進化の詳細については、APIの進化下位互換性に関するドキュメントをご覧ください。

よくある質問 SGIのSTLのためには、まだ読書をお勧めします。


2018年3月の時点で、公式のSTL Webサイトwww.sgi.com/tech/stl/も廃止されました

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.