c++ - What's a quick-and-dirty way to obtain an adapting iterator? -
i have (templated) iterator pair iterator begin1 , iterator end1. have function foo, signature
template <typename forwarditerator> void foo(forwarditerator begin, forwarditerator end); which on range. now, want have foo act not on actual range elements, rather on transformation of these elements lambda or function bar. can't use std::transform or otherwise use temorary storage transformed values, since take space or since i'm not allowed allocate on heap.
now, know can implement kind of adapting iterator myself, i'd rather use ready-made , not reinvent wheel.
so, what's quick , dirty way appropriate adapting iterator pair can pass foo want? i.e. me able call
foo(magic(begin), magic(end)) or
auto new_pair = magic(begin, end); foo(new_pair.first, new_pair.second); ?
eric niebler's range-v3 library provides nice solution this, , planned included in future standard. here's simple example:
std::vector<int> vi{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; using namespace ranges; auto rng = vi | view::transform([](int x){ return x % 2; }); foo(rng.begin(), rng.end()); // when foo dereferences these iterators, // see: [1, 0, 1, 0, 1, 0, 1, 0, 1, 0]. this lazy , efficient, way. :)
Comments
Post a Comment