$include_dir="/home/hyper-archives/boost/include"; include("$include_dir/msg-header.inc") ?>
From: David White (dave_at_[hidden])
Date: 2002-05-21 05:39:28
Noel,
I would suggest making iterator_n the same iterator category as the type
it's adapting. This is so you can do something like:
distance(iterator_n(cont.begin()),iterator_n(cont.end(),n));
and have it operate in constant time if cont is (say), a vector, and in
order n time if cont is (say) a list.
Also, I would make sure it can support input and output iterators as the
base type, since this would also be useful.
Oh and yes, the class template wouldn't be called iterator_n, that's the
name of a helper function template for easy generation of the iterators.
Well, actually "iterator_n" is just a name off the top of my head, a
better name could likely be thought of.
Note that this might have efficiency implications compared to
specialized algorithms, since an iterator_n object will be larger than a
normal iterator, and it's copying will be mildly expensive.
David.
On Tue, 2002-05-21 at 09:35, Noel Yap wrote:
> --- David White <dave_at_[hidden]> wrote:
> > On Mon, 2002-05-20 at 23:13, Noel Yap wrote:
> > > --- David White <dave_at_[hidden]> wrote:
> > > Currently, I've created a function copy_n that
> > copies
> > > at most 'n' elements. 
> > 
> > So do I. Unfortunately this function template has
> > the same name as a
> > function template in a common STL implementation
> > (STLPort) which has
> > slightly different functionality; this can cause
> > confusion.
> > 
> >  I can see other '_n' type
> > > functions.  iterator_n would make such functions
> > moot
> > > so iterator_n would be a great addition to Boost. 
> > Is
> > > there an effort to add this into Boost?
> > 
> > not at this stage, I only just posted the idea;
> > naturally there could be
> > if enough people said they thought it was a good
> > idea...
> 
> I thought it (iterator_n) is such a great idea that I
> got rid of my copy_n function in favor of a newly
> implemented iterator_n adapter.
> 
> I have some minor differences than the one you
> described.  Here's the source if you're interested:
> 
>     template < typename ForwardIterator, typename Size
> = std::size_t >
>     class iterator_n
>     : private boost::iterator<
> std::forward_iterator_tag, typename
> std::iterator_traits< ForwardIterator >::value_type,
> typename std::iterator_traits< ForwardIterator
> >::difference_type >,
>     private boost::forward_iteratable< iterator_n<
> ForwardIterator >, typename std::iterator_traits<
> ForwardIterator >::pointer >
>     {
>         private: ForwardIterator iter;
>         private: Size n;
> 
>         private: void constraints(void)
>         {
>             boost::function_requires< typename
> boost::ForwardIteratorConcept< ForwardIterator > >();
>         }
> 
>         public: iterator_n()
>         : n(0)
>         {
>         }
> 
>         public: iterator_n(ForwardIterator iter, Size
> n = 0)
>         : iter(iter),
>         n(n)
>         {
>         }
> 
>         public: typename std::iterator_traits<
> ForwardIterator >::value_type &operator *(void) const
>         {
>             return *iter;
>         }
> 
>         public: iterator_n &operator ++(void)
>         {
>             ++iter;
>             --n;
>         }
> 
>         public: bool operator ==(const iterator_n
> &rhs) const
>         {
>             return iter == rhs.iter
>             ||  n == rhs.n;
>         }
>     };
> 
> As you can see, it has a default constructor so that
> it can be usable in situations where there is no "end"
> iterator.
> 
> There's probably a lot of room for improvement so I
> welcome any comments.
> 
> Noel
> 
> 
> __________________________________________________
> Do You Yahoo!?
> LAUNCH - Your Yahoo! Music Experience
> http://launch.yahoo.com
> _______________________________________________
> Unsubscribe & other changes: http://listarchives.boost.org/mailman/listinfo.cgi/boost