STL標準講座 35
ストーリー by Oliver
BookReview.new() 部門より
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のコンテナの入門にはよいと思われます。"
本を買うお金のない人は (スコア:3, 参考になる)
リファレンスにどうぞ。 (スコア:2, 参考になる)
リファレンスとしてはとても重宝します。
とても引きやすくて使いやすいので。
なかなかここまでリファレンスとして使える本はSTLに関しては
まだまだ乏しいので。手元に置いておくとたまに活躍してくれます。
STLの部分だけ分かればよい、というレベルの方なら
基本的なSTLの使用法は十分に理解できると思われます。
ただ、高度な部分の利用法については解説がほとんどないので
自作イテレータや自作コンテナを作る向きの方には適さないかと。
Re:もうSTLとは呼ばないのかと思ってましたが (スコア:2)
で、97年にせこせこ書かされたプログラムにはすでに使ってたからその当時のVisual C++にはすでに入ってたですね。まだVersion 5の頃だったかな。
その後個人としては使い方が全然進歩してませんが、それでも日常的なプログラミングにはもうなくてはならないものになっている。
昔はMFCと相性が悪くてconsoleアプリ以外では使い物にならなかったと記憶してますけど改善されたのかな?
C++本は (スコア:2, 参考になる)
・プログラミング言語C++ 第3版
・Effective C++
・More Effective C++
の3冊は必携でしょう。ぜんぶASCIIの赤背表紙です。
# Stroustrupは、第1版も第2版も持ってるけどもう使えん。
STLの作者 (スコア:2, 興味深い)
僕はこの授業をとるまではバリバリの C プログラマだったので、C++ に STL とおぼえることが多くてちょっと苦戦しています。
# 今日その授業のテストだったのですが、かなりだめでした‥。
以前 C でコンテナを書いたときは、どうしても、データを void* で表現し、比較関数のポインタも一緒にソート関数に渡して‥という感じになってしまい、比較関数の呼び出しのオーバーへッドが馬鹿にならず (10 億回呼ばれてたりして) 苦労しました。結局マクロで実装し直したりして。
その点 STL では、テンプレートの魔術で比メンバ関数として実装した比較関数 (operator とか) をインライン展開してくれるので、下手に C で書くより速いコードを出力します。(合ってますよね?ちょっとだけ自信なし) C++ は C より非効率だと信じていただけに、知ったときはちょっとショックでした。
話は変わるんですが、Linux 上で C++ の開発をしようとするとコンパイラは g++ 以外にに選択肢はないと思うのですが、g++ のおすすめのバージョンってどれなんでしょうか?教授は g++-2.95.3 を勧めていますが、g++-3.0 とかってどうなんでしょう?どなたか実際に開発に使われている方がいらしたらアドバイス頂けると幸いです。
Re:もうSTLとは呼ばないのかと思ってましたが (スコア:2)
Re:もうSTLとは呼ばないのかと思ってましたが (スコア:2)
Re:何故に今頃? (スコア:2)
意味があると見込んだから記事が出てるのであって、実際読者にとっての意味の有る無しは読者自身で決めるべきことであります。
# ブックレビューが全然ないから、て言うのもあるけどさ。
Re:標準C++ライブラリ == STL? (スコア:2)
私が、stringやcomplexがSTLの一部と言った根拠ですが、
rm -rf /bin/laden
Re:何故に今頃? (スコア:2)
盛り上がんのは盛り上がんだからいーんやけどさー。
Re:標準C++ライブラリ == STL? (スコア:2)
うげ、定義リスト(DL)使えないのか。
STL
オリジナルに由来するもの。つまりコンテナ、イテレータ、関数オブジェクト、アロケータのあたり。επιστεμε氏の書にいう「ネジ・クギ」
標準C++ライブラリ
STL+string+complex etc.
でしょう。
これは、「長らく標準化が待たれていた文字列クラスだが、ついに標準C++ではSTLの考えを全面的に取り入れたstringクラスが導入された」という歴史的経緯を知らないだけ。
templateを使ってるだけなら、localeとかも該当しますよね。
これはたまたまかも^^;
"Quidquid latine dictum sit, altum videtur."
Re:何故に今頃? (スコア:2)
STL (スコア:1)
かなりSTLで楽をさせてもらっていますね。
逆にSTLの使えない環境を使うとすっげー苦労します。
これは退化なのかと一瞬不安になりますが。
せこせこ今まで自分で書いていたコードが悲しくなったけれどね。
kusanagi shin
string is not in STL (スコア:1)
MFCのクラスライブラリより (スコア:1)
が、やっぱりMFCやVCLとSTLのライブラリはメタファーのレベルが違うと思う。
「新しいパラダイム」と言う表現はある意味当たっていると思いますね。
kusanagi shin
Re:もうSTLとは呼ばないのかと思ってましたが (スコア:1)
近道を通りたかったので、
『プログラミング言語C++』Bjarne Stroustrupから入ったら、
STLでジェネリックプログラミングが自然な流れのように感じました。
また、イテレータのセマンティクスは取っ付きやすいと思いますが、
完全理解といわれると自分としては相当に心もとないです。
それでもSTLを使い出すと、ヘッダーがすごく気になるし、
自分でもテンプレートを書く気になりますね。
今の仕事は、C言語に戻ってしまいましたが。(笑
標準講座C++ (スコア:1)
基礎からSTLを利用したプログラミングまで Programmer’s SELECTION
を誰か持っている人います?STLの解説もあるようなので、気になっているのですが。
rm -rf /bin/laden
Re:もうSTLとは呼ばないのかと思ってましたが (スコア:1)
ん~、特に支障は出てないですね。(注意して使えば(^^;))
MFC-Windowアプリでさんざん使いまくってます。
std::vector<CBitmap*>とかstd::list<CString>とか…。
# CStringList? なにそれ?(笑)
Re:リファレンスにどうぞ。 (スコア:1)
同感です。さらに見るだけでなく、じっくり読んでみるのも
一つの勉強方ですね。分厚い本を買って難解な翻訳を読むより、
論より証拠ということでライブラリの実体が直接確認できますから。
テンプレートの作り方の勉強にもなる生きた教材でしょう。
STL の実物は。
あぅ、勘違い… (スコア:1)
επιστημη氏の前後編記事はDDJJ:1996年4~5月ですから、時期も違いますね(^^;)
(確認してから投稿すべきだった。反省)
Re:何故に今頃? (スコア:1)
rm -rf /bin/laden
Re:標準C++ライブラリ == STL? (スコア:1)
# 私はそれほど厳密である必要はないと思っていますが。
そんなあ(^^;
rm -rf /bin/laden
もうSTLとは呼ばないのかと思ってましたが (スコア:0)
ANSI標準になったのはもう4年前、ISO標準になったのも3年以上前です。
そんなに使われていないですか。
Re:string is not in STL (スコア:0)
Re:STL (スコア:0)
Re:もうSTLとは呼ばないのかと思ってましたが (スコア:0)
debugger support (スコア:0)
いまだにヘッダファイルを見てメモリ構造を手繰る、
という原始的なことをしているのですが、こんな手間がかかるようでは、
まだまだgenericなプログラムツールとは思えません。
なにか幸せになる方法は無いのでしょうか?
# 例えばgdb6.0でサポートする、とか。;-)
何故に今頃? (スコア:0)
Re:debugger support (スコア:0)
一旦バグ作りこんでしまうと泣きますね。
デバッガと、わけ分からんコンパイラからのエラーメッセージ が何とかなれば、我が社の若い連中にもっと勧められるん だけどなぁ。。
私がSTLを嫌う理由 (スコア:0)
Re:リファレンスにどうぞ。 (スコア:0)
標準講座も買ったけど、あまり役に立った記憶がない、というか、どこにおいたか忘れてしまった。
でも慣れてくると、includeディレクトリをごそごそと見る方が早かったりしますね。
標準C++ライブラリ == STL? (スコア:0)
標準C++ライブラリ = (SGIのオリジナルSTLをベースとするテンプレート化されたコンテナクラスおよび関連するクラスのライブラリという意味での)STL + そのほかのクラスライブラリ(string, complex, locale, numeric_limits, 例外 etc.) + 標準C(相当の)ライブラリ
という認識なので、最初の書評やひとつ上の投稿には少し面食らいました。
stringがイテレータ絡みのインターフェイスを持っているのは、文字列が文字のコンテナだと解釈できることや、標準ライブラリのインターフェイスの一貫性を考えれば当然で、これを論拠にSTLにstringが含まれるというのは無理があると考えます。
私が持っているイメージは、stringはそれ自体である程度完結したコンポーネントなのに対し、STLはねじや釘のようなより低レベルの部品であるというものです。(概念の階層が違うとでも言えばいいのでしょうか)
Re:STLの作者 (スコア:0)
std 名前空間がまともに使えるというだけでも移行する価値があると思います。以前のバージョンでは、cout などがグローバルな名前空間にあったので、うっかり std:: を付け忘れてもコンパイルが通ってしまい、後で VC++ とかに移植するときに苦労しました。
ところで、同時に STLport 4.0 を導入しようとしたら、この std 名前空間の扱いの変更のせいか、コンパイルエラーの嵐になってしまったんですけど、これは今は解消されているんでしょうか?
Re:何故に今頃? (スコア:0)
>タレコミ者は見たところ…(以下自主規制;-))
おいおい、そこまで言っちゃ規制になってねーって。
まあまあ、内容はともかく、意見だったら何書いたっていいじゃん。そうイジメなさんな。
Re:STLの作者 (スコア:0)
IA-32(x86) と IA-64 だけですが、Intel C++ Compiler for Linux があります。
残念ながらソースは非公開です。