iteratorによる入出力処理

Cばっかりやってると、C++のトリッキーな処理を忘れてしまうのでメモ。個人的にはこれがシンプルながらもC++らしいテンプレートを駆使したハックだなあ、と感動するのでした。こういうコード見ると、単なる"better C"とは言わせないって気がしますね。

http://www.ne.jp/asahi/yamashita/programming/tips/stream_iterator.html
http://www.kab-studio.biz/Programing/Codian/STL/05.html

#include <iostream>
#include <fstream>
#include <vector>
#include <string>
#include <algorithm>
#include <iterator>

using namespace std;
int main(){
     ifstream ifs("sample.dat");
     vector<string> v;
     copy(istream_iterator<string>(ifs), istream_iterator<string>(),
          back_inserter(v));

     copy(v.begin(), v.end(), ostream_iterator<string>(cout, "\n"));
     return 0;
}
istream_iterator
istreamをiteratorにする。つまり*iでストリームから現在のトークンを取得して、i++で次のトークンへ移動する。第二引数のDistanceはよく分からないけど特に指定する必要はないと思う。
ostream_iterator
ostreamをiteratorにする。第二引数にはデリミターが指定できる。
back_inserter
単なるiteratorではsegmentation faultになるので、内部的にpush_backを発行するためのiterator

しかし、STLを駆使したプログラムはコンパイルエラーが大変なことになる上デバッグが超面倒という罠。vectorで大量のメモリーを確保して・・・なんて処理はオススメしません。