パスワードを忘れた? アカウント作成
1357 story

STL標準講座 35

ストーリー by Oliver
BookReview.new() 部門より

C++の標準ライブラリとして制定されたSTL (Standard Template Library)が本格的に使われはじめたのはつい最近。その正体をしらないC++プログラマも少なくないはずだ。takusiがSTLを扱う本のひとつ、"STL標準講座―標準テンプレートライブラリを利用したC++プログラミングのブックレビューを寄せてくれた。

takusi 曰く," STLについてというよりは、STLのコンテナとそれに関するアルゴリズムの解説に終始しています。タイトルは、むしろ「STLのコンテナとアルゴリズム入門」という方が正しいでしょう。
副題には、「標準テンプレートライブラリ(注:STLのこと)を利用したC++プログラミング」とありますが、全然そんな内容ではありません。単なるSTLのコンテナとアルゴリズムの使い方についての内容です。

complexについては皆無、stringについては若干しか言及されていません。完全なSTLの解説本として考えていると期待はずれになります。またSTLはまだ新しいので、コンパイラの実装などによって、STLの実際の運用面で問題が生じることがありますが、それについてもまったく述べられていません。

STLのコンテナについては、サンプルソースコードなども交えて解説しているので、とても分かり易いです。ただ、スレッドでのコンテナの運用などの高度な事項についての解説は皆無です。アルゴリズムについての解説も非常にあっさりしています。

特にイテレータについての解説が非常に貧弱なのが致命的な欠点です。本書だけで、STLのイテレータを完全に理解するのは困難でしょう。まとめると、本書はSTLのコンテナの入門にはよいと思われます。"

この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。
  • by tkh (235) on 2001年10月24日 16時09分 (#32341) ホームページ 日記
    お金のない人は、SGIのSTLサイトからオンラインマニュアル(html)をダウンロードして使いましょう。チュートリアルサイトへのリンクなどもあります。
  • by Tristun (4233) on 2001年10月24日 1時53分 (#32197)
    私もこの本を使っています。
    リファレンスとしてはとても重宝します。
    とても引きやすくて使いやすいので。

    なかなかここまでリファレンスとして使える本はSTLに関しては
    まだまだ乏しいので。手元に置いておくとたまに活躍してくれます。

    STLの部分だけ分かればよい、というレベルの方なら
    基本的なSTLの使用法は十分に理解できると思われます。
    ただ、高度な部分の利用法については解説がほとんどないので
    自作イテレータや自作コンテナを作る向きの方には適さないかと。

  • Dr.DobbsでSTLの前後編の記事が掲載されて、こりゃ便利そうだし楽そう、と思いつつ読んだのが93年とか94年とかだったと思う。購買に発注したSTL本がいつまで経っても出版されなくてもめたりしたのを覚えてます。

    で、97年にせこせこ書かされたプログラムにはすでに使ってたからその当時のVisual C++にはすでに入ってたですね。まだVersion 5の頃だったかな。

    その後個人としては使い方が全然進歩してませんが、それでも日常的なプログラミングにはもうなくてはならないものになっている。

    昔はMFCと相性が悪くてconsoleアプリ以外では使い物にならなかったと記憶してますけど改善されたのかな?
  • C++本は (スコア:2, 参考になる)

    by gori (3642) on 2001年10月24日 10時32分 (#32260)
    STL以外を求めたら、
    ・プログラミング言語C++ 第3版
    ・Effective C++
    ・More Effective C++
    の3冊は必携でしょう。ぜんぶASCIIの赤背表紙です。

    # Stroustrupは、第1版も第2版も持ってるけどもう使えん。
  • STLの作者 (スコア:2, 興味深い)

    by noboru (4206) on 2001年10月24日 12時33分 (#32292) 日記
    の一人、David R. Musser 教授の授業をいま大学院でとっているんですが、教授は 1971 年(!)頃から Generic Programming という概念を研究していたそうです。1987 年にはその成果を Ada のライブラリとして実装したものの、あまり広まらなかったそうです。その後 C++ のライブラリとして実装した STL は注目を集め、ついには C++ の標準ライブラリに採用されました。STL のような考え方って C++ が生まれる前からあったんですね。

    僕はこの授業をとるまではバリバリの C プログラマだったので、C++ に STL とおぼえることが多くてちょっと苦戦しています。
    # 今日その授業のテストだったのですが、かなりだめでした‥。

    以前 C でコンテナを書いたときは、どうしても、データを void* で表現し、比較関数のポインタも一緒にソート関数に渡して‥という感じになってしまい、比較関数の呼び出しのオーバーへッドが馬鹿にならず (10 億回呼ばれてたりして) 苦労しました。結局マクロで実装し直したりして。

    その点 STL では、テンプレートの魔術で比メンバ関数として実装した比較関数 (operator とか) をインライン展開してくれるので、下手に C で書くより速いコードを出力します。(合ってますよね?ちょっとだけ自信なし) C++ は C より非効率だと信じていただけに、知ったときはちょっとショックでした。

    話は変わるんですが、Linux 上で C++ の開発をしようとするとコンパイラは g++ 以外にに選択肢はないと思うのですが、g++ のおすすめのバージョンってどれなんでしょうか?教授は g++-2.95.3 を勧めていますが、g++-3.0 とかってどうなんでしょう?どなたか実際に開発に使われている方がいらしたらアドバイス頂けると幸いです。
  • 「同じく」じゃないっす。DDJとDDJJ(ってDDJ日本版だよね?)は違うっす。(^^;)ていうか私、DDJ日本版って立ち読みすらしたことないので日本版でSTLが紹介されたのがいつなのかは知らないです。はい。
  • あ、ごめんなさい、何か変なコメントになってますね。単に、私が読んだのは英語版でした、ってだけです。失礼の段はご容赦を。_O_
  • 意味があると見込んだから記事が出てるのであって、実際読者にとっての意味の有る無しは読者自身で決めるべきことであります。

    # ブックレビューが全然ないから、て言うのもあるけどさ。

  • 一般的には、どちらの認識が多数派なんでしょうね。

    私が、stringやcomplexがSTLの一部と言った根拠ですが、
    1. STLのstringをいう言い方をよく聞
    2. vectorなどのコンテナのようにtemplateを利用している
    3. STLのmanual(例:SGIのSTLサイトやVC6のヘルプ)
    4. でvectorなどと一緒に、basic_stringが扱われていることが多い
    --
    rm -rf /bin/laden
  • by Dot.Zeile (1169) on 2001年10月25日 10時15分 (#32550) 日記
    私も正直「何故に今ごろSTL?」と思いました。「オープンソースに適したプログラミング言語」とかXPのアクティベーションの話題でのコメントとか今回の今更「STL」とか、タレコミ者は見たところ…(以下自主規制;-))

    盛り上がんのは盛り上がんだからいーんやけどさー。
  • by crouton (9) on 2001年10月26日 1時02分 (#32756)

    うげ、定義リスト(DL)使えないのか。

    STL
    オリジナルに由来するもの。つまりコンテナ、イテレータ、関数オブジェクト、アロケータのあたり。επιστεμε氏の書にいう「ネジ・クギ」

    標準C++ライブラリ
    STL+string+complex etc.

    でしょう。

    1. STLのstringをいう言い方をよく聞

    これは、「長らく標準化が待たれていた文字列クラスだが、ついに標準C++ではSTLの考えを全面的に取り入れたstringクラスが導入された」という歴史的経緯を知らないだけ。

    2. vectorなどのコンテナのようにtemplateを利用している

    templateを使ってるだけなら、localeとかも該当しますよね。

    3. STLのmanual(例:SGIのSTLサイトやVC6のヘルプ)でvectorなどと一緒に、basic_stringが扱われていることが多い

    これはたまたまかも^^;

    --
    "Quidquid latine dictum sit, altum videtur."
  • by Dot.Zeile (1169) on 2001年10月26日 10時10分 (#32823) 日記
    何か気になります?気にならないんだったらほっとけ。気になるんだったら自分で考えるべ。
  • by kusanagi (3927) on 2001年10月24日 2時42分 (#32208)
    無いともう暮らしていけません(苦笑)
    かなりSTLで楽をさせてもらっていますね。
    逆にSTLの使えない環境を使うとすっげー苦労します。
    これは退化なのかと一瞬不安になりますが。
    せこせこ今まで自分で書いていたコードが悲しくなったけれどね。
    --
    kusanagi shin
  • complexについては皆無、stringについては若干しか言及されていません。完全なSTLの解説本として考えていると期待はずれになります。
    string と complex は STL じゃないっす。
  • VCLが好きだったので結構すんなりstringクラスにはなじめましたね。
    が、やっぱりMFCやVCLとSTLのライブラリはメタファーのレベルが違うと思う。
    「新しいパラダイム」と言う表現はある意味当たっていると思いますね。
    --
    kusanagi shin
  • 「C++でプログラムを作って」と言われた時から、STL使ってます。

    近道を通りたかったので、
    『プログラミング言語C++』Bjarne Stroustrupから入ったら、
    STLでジェネリックプログラミングが自然な流れのように感じました。

    また、イテレータのセマンティクスは取っ付きやすいと思いますが、
    完全理解といわれると自分としては相当に心もとないです。

    それでもSTLを使い出すと、ヘッダーがすごく気になるし、
    自分でもテンプレートを書く気になりますね。

    今の仕事は、C言語に戻ってしまいましたが。(笑
  • 標準講座 C++
    基礎からSTLを利用したプログラミングまで Programmer’s SELECTION

    を誰か持っている人います?STLの解説もあるようなので、気になっているのですが。
    --
    rm -rf /bin/laden
  • 同じくDDJのεπιστημη氏の記事から知りました。
    昔はMFCと相性が悪くてconsoleアプリ以外では使い物にならなかったと記憶してますけど改善されたのかな?
    ん~、特に支障は出てないですね。(注意して使えば(^^;))
    MFC-Windowアプリでさんざん使いまくってます。
    std::vector<CBitmap*>とかstd::list<CString>とか…。

    # CStringList? なにそれ?(笑)
  • > includeディレクトリをごそごそと見る方が早かったりしますね。

    同感です。さらに見るだけでなく、じっくり読んでみるのも
    一つの勉強方ですね。分厚い本を買って難解な翻訳を読むより、
    論より証拠ということでライブラリの実体が直接確認できますから。
    テンプレートの作り方の勉強にもなる生きた教材でしょう。
    STL の実物は。
  • by T.Sawamoto (4142) on 2001年10月25日 11時47分 (#32567)
    「同じく」じゃないっす。DDJとDDJJ(ってDDJ日本版だよね?)は違うっす。(^^;)ていうか私、DDJ日本版って立ち読みすらしたことないので日本版でSTLが紹介されたのがいつなのかは知らないです。はい。
    おっと、失礼しました。m(_ _)m
    επιστημη氏の前後編記事はDDJJ:1996年4~5月ですから、時期も違いますね(^^;)
    (確認してから投稿すべきだった。反省)
  • ん?何々?そんなにタレコミはまずかったですか?
    --
    rm -rf /bin/laden
  • これは、「長らく標準化が待たれていた文字列クラスだが、ついに標準C++ではSTLの考えを全面的に取り入れたstringクラスが導入された」という歴史的経緯を知らないだけ。
    私は特別、歴史的な経緯に詳しいわけではないのですが、SGIのサイトでSTLをダウンロードしようとすると、その中にstringが含まれています。(complexはない)。SGIのSTLがreference的な位置付けだと思うで、それにstringがあるといことは、stringはSTLの一部と言って良いと思います。
    # 私はそれほど厳密である必要はないと思っていますが。
    これはたまたまかも^^;
    そんなあ(^^;
    --
    rm -rf /bin/laden
  • by Anonymous Coward on 2001年10月24日 4時14分 (#32219)
    少なくとも5年前から使ってます。

    ANSI標準になったのはもう4年前、ISO標準になったのも3年以上前です。

    そんなに使われていないですか。

  • by Anonymous Coward on 2001年10月24日 4時18分 (#32221)
    でもイテレーター関係なんかもstringにあって、すでにC++ライブラリとして一体化してるんだから、そんな歴史的なことをいってもしょうがないでしょう。
  • by Anonymous Coward on 2001年10月24日 4時34分 (#32223)
    STLが緻密に設計されているのはよくわかるのですが、 最初にMFCのコレクションクラスに慣れてしまった自分にとっては、どうも使い勝手が悪く感じられます。 STLではありませんが、文字列クラスもMFCのCStringが好き(メモリイメージがそのままchar*互換なところとか)。 リストクラスはGlibのGSListみたいなやり方が好き。そんなこんなで結局、好きなクラスライブラリのやり方を真似た、自前の実装を書いてしまいます。
  • by Anonymous Coward on 2001年10月24日 12時23分 (#32288)
    VC++ 4 にはもう HP STL ベースのものが入ってましたね。 HP STL (SGI STL) 由来でない STL 実装てあるのかな。
  • by Anonymous Coward on 2001年10月24日 13時55分 (#32315)
    gdbでデバッグするときには、「list<X>の2番目の要素を見たい」という単純な要求にすら、
    いまだにヘッダファイルを見てメモリ構造を手繰る、
    という原始的なことをしているのですが、こんな手間がかかるようでは、
    まだまだgenericなプログラムツールとは思えません。
    なにか幸せになる方法は無いのでしょうか?
    # 例えばgdb6.0でサポートする、とか。;-)
  • by Anonymous Coward on 2001年10月24日 13時57分 (#32316)
    本も1999年のものだし,amazonのレビューも半年以上前のもの。 何か意味あるのかな?
  • by Anonymous Coward on 2001年10月24日 14時05分 (#32317)
    あ~、そうそう。 STLって、バグの出にくいコード書くのにいいけど。
    一旦バグ作りこんでしまうと泣きますね。

    デバッガと、わけ分からんコンパイラからのエラーメッセージ が何とかなれば、我が社の若い連中にもっと勧められるん だけどなぁ。。
  • by Anonymous Coward on 2001年10月24日 16時29分 (#32348)
    教授は 1971 年(!)頃から Generic Programming という概念を研究していたそうです
    昔、はじめてSTLのことを聞いたときにGeneric Programmingについて調べようと思い、洋書屋で本を探しました。一冊だけ見つけて購入しました。読み始めて「なんか変だぞ???」と思ってよーく表題を見ました。「Genetic Programming」の本でした。
  • by Anonymous Coward on 2001年10月24日 21時47分 (#32461)
    私は「国際規格(ISO) C++ライブラリハンドブック」をリファレンスに使っています。
    標準講座も買ったけど、あまり役に立った記憶がない、というか、どこにおいたか忘れてしまった。

    でも慣れてくると、includeディレクトリをごそごそと見る方が早かったりしますね。
  • by Anonymous Coward on 2001年10月24日 23時43分 (#32501)
    歴史的っていうか、私も
    標準C++ライブラリ = (SGIのオリジナルSTLをベースとするテンプレート化されたコンテナクラスおよび関連するクラスのライブラリという意味での)STL + そのほかのクラスライブラリ(string, complex, locale, numeric_limits, 例外 etc.) + 標準C(相当の)ライブラリ
    という認識なので、最初の書評やひとつ上の投稿には少し面食らいました。

    stringがイテレータ絡みのインターフェイスを持っているのは、文字列が文字のコンテナだと解釈できることや、標準ライブラリのインターフェイスの一貫性を考えれば当然で、これを論拠にSTLにstringが含まれるというのは無理があると考えます。
    私が持っているイメージは、stringはそれ自体である程度完結したコンポーネントなのに対し、STLはねじや釘のようなより低レベルの部品であるというものです。(概念の階層が違うとでも言えばいいのでしょうか)
  • by Anonymous Coward on 2001年10月25日 12時00分 (#32568)
    > g++-3.0 とかってどうなんでしょう

    std 名前空間がまともに使えるというだけでも移行する価値があると思います。以前のバージョンでは、cout などがグローバルな名前空間にあったので、うっかり std:: を付け忘れてもコンパイルが通ってしまい、後で VC++ とかに移植するときに苦労しました。

    ところで、同時に STLport 4.0 を導入しようとしたら、この std 名前空間の扱いの変更のせいか、コンパイルエラーの嵐になってしまったんですけど、これは今は解消されているんでしょうか?
  • by Anonymous Coward on 2001年10月25日 13時12分 (#32576)
    わははは、俺なんか今ごろ「STL って何?」と思いました。論外?

    >タレコミ者は見たところ…(以下自主規制;-))

    おいおい、そこまで言っちゃ規制になってねーって。
    まあまあ、内容はともかく、意見だったら何書いたっていいじゃん。そうイジメなさんな。
  • by Anonymous Coward on 2001年10月31日 8時58分 (#34341)

    IA-32(x86) と IA-64 だけですが、Intel C++ Compiler for Linux があります。

    残念ながらソースは非公開です。

typodupeerror

弘法筆を選ばず、アレゲはキーボードを選ぶ -- アレゲ研究家

読み込み中...