イテレータ
というわけで、イテレータの素晴らしさにようやく気付いたわけなんだけど、STLのイテレータは「何をやったらイテレータが無効になるかいまいちわからん」という問題がある。
/* 引数に渡せるコンテナは? */ template < typename T, typename Pred > void nanika( T &c, Pred p ) { T::iterator end = c.end(); for ( T::iterator i = c.begin(); i != end; i++ ) { if ( p( *i ) ){ c.push_back( *i ); } } }
ここらへんは、効率優先したからだと思うし、C++的にはそれで正しいと思うけど、いや、まあ、だからなに?
それは許せるんだけど、中には、コピーしといても保存されないイテレータがあるのは気をつけないといけないと思った。
std::string ident( std::istreambuf_iterator<char> ite ) { std::istreambuf_iterator<char> begin = ite; while ( isalpha(*ite) ) { ite++; } return std::string( begin, ite ); /* Oops! begin も進んどる!! */ }