イテレータ

というわけで、イテレータの素晴らしさにようやく気付いたわけなんだけど、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 も進んどる!! */
}