Boost logo

Boost :

Subject: Re: [boost] best way to remove duplicates from forwardIterator [startIter, endIter]
From: Damian Coventry (damian.coventry_at_[hidden])
Date: 2009-02-25 16:18:41


std::unique will do what you want. But it comes with a conditions though...

You must have 'consecutive equal elements'
std::unique can't be used on an associative container

If you can't satisfy these requirements, you could try inserting all your
data into a set<>, as Dave suggests. Then copying it all into a vector<> and
calling unique() on it.

Perhaps you could copy from the set<> into a list<>, then use the set
class's unqiue() member, as it's more efficient due to relinking ptrs and
not assigning element values.

~Damian();

On Wed, Feb 25, 2009 at 6:22 AM, David Abrahams <dave_at_[hidden]> wrote:

>
> on Tue Feb 24 2009, Sandeep Gupta <gupta.sandeep-AT-gmail.com> wrote:
>
> > Hi,
> > Given a collection in terms of [startIter, endIter] how can obtain
> > [uniqBeginIter, uniqEndIter] that represents unique elements of the
> > original container.
> > I can always explicitly instantiate a set S of [startIter, endIter]
> > and use [S.begin(), S.end()]. Is it possible to express this in terms
> > of algorithms.
> >
> > Please note that I won't be able to use std::sort as startIter does
> > not conform to RandomAccessIterator. Its a forward iterator.
>
> If they are not already arranged so that all the equal elements are
> adjacent to one another, your best bet is set<> (or unordered_set<>).
>
> FWIW, It is possible to write a conforming std::sort that works on
> forward iterators, but for some reason the standard only requires sort
> to work on random access iterators.
>
> --
> Dave Abrahams
> BoostPro Computing
> http://www.boostpro.com
> _______________________________________________
> Unsubscribe & other changes:
> http://lists.boost.org/mailman/listinfo.cgi/boost
>


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk