Witz
Hi,
I would like to raise a couple of points about the iterator adaptors.
Firstly, is it really necessary to have the predicate as part of the template specification for the filter_iterator? Surely it can be assumed that it will always be convertible to boost::function
?
If you don't care about efficiency, yes it can. We do care, so we won't make that assumption. It might make sense to use that as a default template argument, though that would establish a dependency between filter_iterator and the function lib.
Secondly, by allowing the return type of the function used by the transform_iterator to be a reference can we not use it to implement a more generic form of indirect_iterator? The code below gives a flavour of the idea.
struct dereference { typedef int result_type;
int* data_;
dereference(int* data):data_(data){} int operator()(int i) const { return data_[i]; } };
int main() { int data[] = { 1,2,3,4,5,6,7,8 }; int keys[] = { 0,3,1,6,5,4,2,7 };
typedef boost::transform_iterator_generator
::type indirect_iterator; indirect_iterator i(keys, dereference(data)), i_end(keys+8,dereference(data));
while(i != i_end) std::cout << *i++ << ' ';
return 0; }
The output is:
1 4 2 7 6 5 3 8
The new iterator adaptors library in CVS *does* allow transform_iterator's return to be a reference. With the old library, you just want to use project_iterator_adaptor instead. -- Dave Abrahams Boost Consulting www.boost-consulting.com