STL & iostream 入門  
いめぇじ 透明1ドットイメージ
 C++ コンパイラに必ず付属している「標準 C++ ライブラリ」、その根幹を成すSTL と iostream 。
 
 素晴らしい魅力を持つこのライブラリは、正しい理解をされることなく地に埋もれようとしています。それは非常にもったいないことです。このライブラリを使いこなすことで、皆さんの「 C++ プログラミングに対する概念」は大きく変わることでしょう。そして、より強固で短く、読みやすいプログラムを組めるようになるはずです。このライブラリは、それだけのポテンシャルを持っているのです。
 
 「 STL & iostream 入門」は、 STL と iostream の「本質」を伝えます。それを知ることで皆さんは、うわべだけの使いやすさじゃない、「本物のライブラリ」というものに気付くことでしょう。そして、皆さんの C++ プログラマーとしてのレベルは必ず上がるはずです。
 
 自分が書いた C++ プログラムをさらに精錬させたいあなた、今すぐ購読登録しましょう!
 
 
透明1ドットイメージ
 
 
STL って、 iostream ってなに?
 STL と iostream は、「標準 C++ ライブラリ」というライブラリに含まれています。「標準」という名が付いているとおり、このライブラリは C++ プログラミングにおける最も標準的なライブラリです。
 「標準」ですから、現在のほとんどすべての C++ コンパイラ/開発環境で使用することができます。さらに、このふたつのライブラリには多くの魅力が隠されています。
 
 STL ( Standard Template Library )は for や while を取り除くためのテンプレートライブラリです。長々とした意味の分かりづらいループを、アルゴリズム・イテレーター・関数オブジェクト・コンテナを用いて分かりやすいコードへと書き換えることができます。
 
  iostream は標準入出力・ファイル・文字配列・ std::string などあらゆる対象への書式化入出力を行うクラスを提供するライブラリです。演算子を用いた分かりやすい操作だけで簡単かつ安全に入出力を行えます。また、カスタマイズクラスを作成することでどんな対象へも簡単に入出力できるようになります。
 
 このふたつのライブラリは「可読性」「汎用性」「カスタマイズ」という非常に魅力的であり他のライブラリにはない機能を持っています。これが逆に、このライブラリの「理解のしにくさ」へと継ながっていると言えます。「 STL & iostream 入門」では、この魅力を余すことなく伝えたいと思います。
 
 そのため「 STL & iostream 入門」では、リファレンス性より、使い方や概念についての解説を中心に据えています。「アルゴリズム一覧」等は、後述の「副読書」などを参考にしてください。
 逆に言えば、 STL と iostream の「使い方や概念」についての解説書はほとんどないということです。これらのライブラリの「本質」を理解したいあなたに送る、珠玉のメールマガジンです。
 
 
透明1ドットイメージ
 
 
 「 STL & iostream 入門」は……
まぐまぐを通して配信されるメールマガジンでした。
・毎週水曜午前11時ごろに発送していました。
・1999年4月から2000年10月まで、全25回配信しました。
・2000年10月から2001年4月まで、全25回再放送を配信しました。
・各号「 STL 」「 C++ 」「 iostream 」の解説みっつを掲載しています。
CodianにHTML版を掲載しています。
・全部まとめてダウンロードもできます。
・全50回(本放送+再放送)は次のように配信しました。
 
日付 No. STL C++ iostream
4/5 #01 アルゴリズムとは 名前空間&
ヘッダーファイル名
文字列操作
4/12 #02 置き換える意味 関数テンプレート いろんな値を
渡してみよう
4/19 #03 アルゴリズム
配列ひとつ編
クラス きれいに表示しよう
4/26 #04 アルゴリズム
配列ふたつ&みっつ編
演算子の
オーバーロード
C 言語との違い
5/3 #05 アルゴリズムを作ろう! 変数の作り方 ポインタの移動
5/10 #06 関数オブジェクト クラステンプレート ポインタの位置
5/17 #07 関数オブジェクト
の使い方
関数のオーバーロード データの取り出し
5/24 #08 関数オブジェクト
の作り方
フラグと enum 書き込みと
読み取りの違い
5/31 #09 プレディケート typedef と typename 読み取りエラー
の対処法
6/7 #10 演算子と関数オブジェクト 継承 入力クラスと出力クラス
6/14 #11 関数オブジェクト
の正しい作り方
const メンバ関数 ファイル入出力
6/21 #12 バインダーで楽しよう メンバ関数ポインタ オープンモードと
バッファリング
6/28 #13 関数を
関数オブジェクトに
コンストラクタと
デストラクタ
ファイルポインタ
7/5 #14 イテレーター bool 型 標準入出力
7/12 #15 イテレータータグ this ポインタ iostream の連携
7/19 #16 イテレーターの作り方 ポリモーフィズム iostream の仕組み
7/26 #17 イテレーターの汎用性 基底クラスの初期化 iostream の
組み合わせ例
8/2 #18 コンテナ グローバルな演算子の
オーバーロード関数
<< と >> の
オーバーロード
8/9 #19 コンテナと
アルゴリズム
new と delete マニピュレーターを作る
8/23 #20 vector と
deque と list
ないと呼べない 引数付きマニピュレーターを
作る
8/30 #21 インサートイテレーター protected 文字列バッファクラスを
作る
9/6 #22 set と multiset デフォルト引数 カスタムバッファクラスで
オーバーライド
9/13 #23 連想コンテナと
プレディケート
文字型 操作用・オーバーライド用
メンバ関数
9/20 #24 map と multimap コンパイラの限界 ポインタ以外の
カスタムバッファクラス
9/27 #25 STL & iostream
 
日付 No. STL C++ iostream
10/4 #01 アルゴリズムとは 名前空間&
ヘッダーファイル名
文字列操作
10/11 #02 置き換える意味 関数テンプレート いろんな値を
渡してみよう
10/18 #03 アルゴリズム
配列ひとつ編
クラス きれいに表示しよう
10/25 #04 アルゴリズム
配列ふたつ&みっつ編
演算子の
オーバーロード
C 言語との違い
11/1 #05 アルゴリズム
配列ふたつ&みっつ編
演算子の
オーバーロード
C 言語との違い
11/8 #06 関数オブジェクト クラステンプレート ポインタの位置
11/15 #07 関数オブジェクト
の使い方
関数のオーバーロード データの取り出し
11/22 #08 関数オブジェクト
の作り方
フラグと enum 書き込みと
読み取りの違い
11/29 #09 プレディケート typedef と typename 読み取りエラー
の対処法
12/6 #10 演算子と関数オブジェクト 継承 入力クラスと出力クラス
12/13 #11 関数オブジェクト
の正しい作り方
const メンバ関数 ファイル入出力
12/20 #12 バインダーで楽しよう メンバ関数ポインタ オープンモードと
バッファリング
12/27 #13 関数を
関数オブジェクトに
コンストラクタと
デストラクタ
ファイルポインタ
1/10 #14 イテレーター bool 型 標準入出力
1/17 #15 イテレータータグ this ポインタ iostream の連携
1/24 #16 イテレーターの作り方 ポリモーフィズム iostream の仕組み
1/31 #17 イテレーターの汎用性 基底クラスの初期化 iostream の
組み合わせ例
2/7 #18 コンテナ グローバルな演算子の
オーバーロード関数
<< と >> の
オーバーロード
2/14 #19 コンテナと
アルゴリズム
new と delete マニピュレーターを作る
2/21 #20 vector と
deque と list
ないと呼べない 引数付きマニピュレーターを
作る
2/28 #21 インサートイテレーター protected 文字列バッファクラスを
作る
3/7 #22 set と multiset デフォルト引数 カスタムバッファクラスで
オーバーライド
3/14 #23 連想コンテナと
プレディケート
文字型 操作用・オーバーライド用
メンバ関数
3/21 #24 map と multimap コンパイラの限界 ポインタ以外の
カスタムバッファクラス
3/28 #25 STL & iostream
注:再放送の #05 には誤って #04 と同じ内容を送信していまいました。ごめんなさい。
 
 
透明1ドットイメージ
 
 
 STL と iostream の使い方
「 STL & iostream 入門」では「具体的な解説」しかしませんので、購読する前に「 STL と iostream は使える」という状態にまではしておいてください。
 STL も iostream も「標準 C++ ライブラリ」というライブラリに含まれています。このライブラリは、現在の多くの C++ コンパイラ/開発環境に添付されています。そのため、別途「標準 C++ ライブラリ」を入手する必要はありません
 逆に、添付されていない場合には、コンパイラの性能が低いため「標準 C++ ライブラリ」を使用できない可能性が非常に高いと言えます。この場合には、最新のコンパイラ/開発環境を入手してください。
 
コンパイラ/開発環境ごとの確認と注意
gcc の場合
 次のソースコードを -lstdc++ というスイッチを付けてコンパイルしてみてください。
#include <stdio.h>
#include <vector>
#include <iostream>
#include <strstream>

int main( int p_argc, char* p_argv[] )
{
	std::vector<int> cIntVec( 10, 100 );
	char ch[260];
	std::strstream cStrStrm( ch, 256 );
	cStrStrm
		<< "v[5]: "
		<< cIntVec[5]
		<< std::ends;
	printf( "%s\n", ch );

	return 0;
}
	
 コンパイルできて v[5]: 100 という結果が出力されればOK。
 一般的な gcc では -lstdc++ のコンパイラスイッチで、標準 C++ ライブラリのインクルードファイル・ライブラリファイルを指定してくれます。
 
Visual C++ の場合(MFCを使う場合)
 まず各プロジェクト内の StdAfx.h 内、 //{{AFX_INSERT_LOCATION}} と書かれた行の直前で次のファイルをインクルードしてください。
#include <vector>
#include <iostream>
#include <strstream>
//{{AFX_INSERT_LOCATION}}
	
 標準 C++ ライブラリの各インクルードファイルは、ここでインクルードするようにしてください。他の位置だとエラーが発生する場合があります。
 次に、以下の関数を適当なソースファイルに書き込んで、適当な場所から呼び出してください。例えば CxxxDlg.cpp 内に書き込んで、「ボタンを押したとき」のハンドラ関数から呼び出すとかしてください。
#define printf TRACE

void Checker()
{
	std::vector<int> cIntVec( 10, 100 );
	char ch[260];
	std::strstream cStrStrm( ch, 256 );
	cStrStrm
		<< "v[5]: "
		<< cIntVec[5]
		<< std::ends;
	printf( "%s\n", ch );
}
	
 ビルドが成功して、実行後アウトプットウィンドウに v[5]: 100 と表示されればOK。
 MFCを使用した場合、 printf() が使用できないので、 TRACE() へと置き換える必要があります。誌面に掲載されたサンプルプログラムを使用する場合には、このように #define を使用して置き換えてください。
 
Visual C++ の場合(コンソール)
 gcc と同じサンプルコードをコンパイルしてみてください。ただし、スイッチを加える必要はありません。
 
以上のように、コンパイラ/開発環境ごとにサンプルコードの使い方が異なります。これを踏まえて、サンプルに書かれたプログラムがうまくコンパイルできるか確認しておきましょう。
 
 
透明1ドットイメージ
 
 
 「 STL & iostream 入門」の命名規則について。
 このメールマガジンのサンプルコードに使用している「命名規則」は、僕がいつも使っている「我流ハンガリアン記法」です。これは、あんまりよくない例ですが、それでもこれを使用することに決めました。
 この命名規則は……
 
・大文字小文字を使って単語を表記する。
・クラスのプレフィックスは C 。
・変数のプレフィックスは型を表す小文字。ただしクラスは c 。
・さらにポインタは p 、参照は r を付加する。
・さらに引数には p_ 、テンプレート引数には type_ を付加する。
 
 というものです。
 実際にサンプルコードを見てもらえれば分かりますが、「標準 C++ ライブラリ」はこれとは対極にある命名記法を使用しています。なので、どれがサンプルコードで新たに加えた物なのか一目で分かると思います(名前空間があるんだからホントは必要ないかも……)。
 さらに付け加えれば、「標準 C++ ライブラリ」の各クラス・メンバ関数の名前は無理に短縮されているものが多くあり、分かりにくいと僕は考えるため、「あえて真似する必要はない」という意味も含めて別の命名規則を選びました。
 ま、とりあえず両方の規則を見て、どちらが自分に向いてるか考えてみてください。
 
 
透明1ドットイメージ
 
 
副読書について
 前述の通り、「 STL & iostream 入門」はリファレンス性についてはあまり重要視していないため、「他にどんな関数があるんだろう」という場合には困ると思います。そういうときのために「副読書」の購入をお勧めします。
 
 C++ は Effective C++ という本がお勧め。この本には演算子のオーバーロード関数の作り方やクラスの設計方法についての基本的なことが書かれています。この本を読んでおくことで STL や iostream のコードがそれほど苦なく読めるようになると思います。
 
 STL はStandard Template Library プログラミングという本がお勧め。分かりやすく、サンプルコードも多く、リファレンス性も高いとバランスのいい内容になっています。買っておいて損はないでしょう。
 この本の他に、インターネット上にもリファレンスサイトが多数ありますので探してみてください。 STL は非常に恵まれた環境と言えます。
 
 iostream については、残念ながらお奨めの本がありません。 iostream だけの解説書がほとんどなく、 C++ の解説書のおまけとして書いてあるくらい扱いが良くないです。逆に言えば、皆さんが持っている解説書の最後に iostream の解説が載っている可能性は高いと思うので、そちらをご覧ください。
 残念ながらホームページもあまりないのですが、 STL よりも古くからある分、サンプルコードはかなりの数が見つかると思います。使用例が必要なときは探してみてください。と言っても、古い書き方をされている場合にはあまり役立たないかもしれませんが……。
 
 STL も iostream も、基本的にはテンプレートライブラリなので、たいがいソースコードが付いています。そのコードを見るのが一番かもしれません。ただし iostream はすべてがテンプレート化されているわけではないのでご注意を。
 あと、 Visual C++ のように開発環境にドキュメント( MSDN )が付いている場合もあります。それもご覧ください。
 
 
透明1ドットイメージ
 
 
STL & iostream 入門特製壁紙!
壁紙サンプル  なんと「 STL & iostream 入門特製壁紙」を作ってしまいました! 右のイメージはその壁紙を縮小したもの。 STL と iostream の全体構造が一目で見て取れる優れものです。この壁紙は再配布OKなのでみんなに配ったり会社のデフォルトにしたりしてしまいましょう(爆)。
 
壁紙ダウンロード( Jpeg )
1024x768
800x600
 
(C)KAB-studio 2000 - 2001 ALL RIGHTS RESERVED.