行単位で読み込む input_iterator
行単位で読み込むinput_iteratorが見つからなかったので自作してみた。
なんかBoostのライブラリを組み合わせればできるような気もするけど。
#include <string> #incldue <iostream> #include <iterator> #include <boost/iterator/iterator_facade.hpp> template<typename CharType, typename Traits = std::char_traits<CharType> > class basic_istream_line_iterator : public boost::iterator_facade< basic_istream_line_iterator<CharType, Traits>, const std::basic_string<CharType, Traits>, std::input_iterator_tag> { public: typedef CharType char_type; typedef Traits traits_type; typedef std::basic_istream<CharType, Traits> istream_type; typedef std::basic_string<CharType, Traits> string_type; public: basic_istream_line_iterator() : in_(0), ok_(false) { } basic_istream_line_iterator(istream_type& in) : in_(&in) { read(); } void increment() { read(); } bool equal(const basic_istream_line_iterator& x) const { return ok_ == x.ok_ && in_ == x.in_; } const string_type& dereference() const { return line_; } private: void read() { ok_ = std::getline(*in_, line_); if (!ok_) { in_ = 0; } } private: istream_type* in_; bool ok_; string_type line_; }; typedef basic_istream_line_iterator<char> istream_line_iterator;
使うときはこんな感じ。
int main(int argc, char **argv) { using namespace std; vector<string> lines; copy(istream_line_iterator(cin), istream_line_iterator(), back_inserter(lines)); sort(lines.begin(), lines.end()); copy(lines.begin(), lines.end(), ostream_iterator<string>(cout, "\n")); return 0; }
しかし、STLやBoostをバリバリ使っていないと何が何だかわからないソースだな。