
Hi, Nathan. Oven Library has solution for this problem. oven::memoized adaptor: http://p-stade.sourceforge.net/oven/doc/html/oven/range_adaptors.html#oven.r... #include <iostream> #include <vector> #include <boost/range/adaptor/transformed.hpp> #include <boost/range/adaptor/filtered.hpp> #include <boost/range/algorithm/copy.hpp> #include <pstade/oven/memoized.hpp> int transform(int i) { std::cout << "calling transform() on " << i << "\n"; return i + 1; } bool filter(int i) { return i % 2 == 0; } int main() { int a[] = {1, 2, 3, 4, 5, 6, 7, 8}; int b[8]; boost::copy(a | boost::adaptors::transformed(transform) | pstade::oven::memoized | boost::adaptors::filtered(filter), b); return 0; } results: calling transform() on 1 calling transform() on 2 calling transform() on 3 calling transform() on 4 calling transform() on 5 calling transform() on 6 calling transform() on 7 calling transform() on 8 2011/5/31 Nathan Ridge <zeratul976@hotmail.com>:
As you can see, the transform function is called twice for elements that pass the filter.
Can this be avoided? In my real use case, the transformation performs a database lookup, and it should not be done twice.
Thanks, Nate.
======================== Akira Takahashi mailto:faithandbrave@gmail.com blog:http://d.hatena.ne.jp/faith_and_brave/