takewhileと似ていますが、実のところあまり使いません。
叙述関数がtrueの間は値を出しません。
template<typename T, typename U> class cDropWhile : public cIterable<T> { U pred; std::shared_ptr<cIterable<T>> gen; bool first; public: cDropWhile(U p, std::shared_ptr<cIterable<T>> g) : pred(p), gen(g), first(true) { } bool exists_next() { if(first) { first = false; while(gen->exists_next()) { if(!pred(gen->value())) return true; } return false; } else { return gen->exists_next(); } } T value() const { return gen->value(); } }; template<typename T, typename U> std::shared_ptr<cIterable<T>> dropwhile( U pred, std::shared_ptr<cIterable<T>> gen) { return std::shared_ptr<cIterable<T>>(new cDropWhile<T,U>(pred, gen)); }
下のコードは、4より小さい間は値は出さずにそのあとは出します。
int main() { auto f = [] (int n) { return n * (4 - n); }; auto g = map(f, range(5)); // 0 3 4 3 0 cout << dropwhile([] (int n) { return n < 4; }, g) << endl; // 4 3 0 }