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.
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
> Unsubscribe & other changes:
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk