Boost logo

Boost Users :

From: David Abrahams (dave_at_[hidden])
Date: 2003-10-05 07:01:25


Witz <witz_at_[hidden]> writes:

> 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<bool
> (const value_type&)> ?

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<dereference,
> int*>::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

Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net