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で大量のメモリーを確保して・・・なんて処理はオススメしません。