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
#include
#include
#include
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 :
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/