Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Sorting a list Structure

0 views
Skip to first unread message

Mike Copeland

unread,
Oct 27, 2008, 6:19:59 PM10/27/08
to
I'm confused about how to sort a list on an element of the list's
structure. Here is my data definition:

struct Finishes // computed Finish information
{
long netTime;
int bibNumber;
} fWork;
typedef list<Finishes> FINISHES;
FINISHES finishInfo;
list<Finishes>::iterator fIter;

I have populated the list successfully, and now I want to sort the
list on the netTime element. All examples of the list.sort I've found
work only with scalars or single-element structures. How do I do this
with my data? TIA

Juha Nieminen

unread,
Oct 27, 2008, 6:29:26 PM10/27/08
to

You either define an operator<() in your Finishes struct, or you give
a comparator function to the std::list::sort() function as a parameter.

If comparing objects of type 'Finishes' with the < operator is
rational, that's the easiest solution. In other words, you would do this:

struct Finishes
{
long netTime;
int bibNumber;

bool operator<(const Finishes& rhs) const
{
return netTime < rhs.netTime;
}
};

If the operator < does not make logical sense in the struct and you
would want to avoid it, then you can supply a comparator to the list
sort function:

bool finishesComparator(const Finishes& lhs, const Finishes& rhs)
{
return lhs.netTime < rhs.netTime;
}
...

yourList.sort(finishesComparator);

Salt_Peter

unread,
Oct 28, 2008, 10:50:30 AM10/28/08
to

Why not use an appropriate container like std::map where netTime is
the key and the integer its values? Elements are then sorted on
insertion using the default comparator less<>.

#include <iostream>
#include <map>

int main()
{
std::map< long, int > finishes;
finishes[10L] = 10;
finishes[3L] = 3;
finishes[2L] = 2;
finishes[4L] = 4;
finishes[1L] = 1;
finishes.insert( std::pair< long, int >(9L, 9) );


typedef std::map< long, int >::iterator MIter;
for( MIter miter = finishes.begin();
miter != finishes.end();
++miter )
{
std::cout << (*miter).first;
std::cout << "\t";
std::cout << (*miter).second << std::endl;
}

std::cout << "press Enter to EXIT\n";
std::cin.get();
}

/*
1 1
2 2
3 3
4 4
9 9
10 10
*/

Mike Copeland

unread,
Oct 29, 2008, 8:38:03 AM10/29/08
to
> > I have populated the list successfully, and now I want to sort the
> > list on the netTime element. All examples of the list.sort I've found
> > work only with scalars or single-element structures. How do I do this
> > with my data? TIA
>
> You either define an operator<() in your Finishes struct, or you give
> a comparator function to the std::list::sort() function as a parameter.
>
> If comparing objects of type 'Finishes' with the < operator is
> rational, that's the easiest solution. In other words, you would do this:
>
> struct Finishes
> {
> long netTime;
> int bibNumber;
>
> bool operator<(const Finishes& rhs) const
> {
> return netTime < rhs.netTime;
> }
> };

Yes, that works perfectly. Thanks!

Mike Copeland

unread,
Oct 31, 2008, 4:58:30 PM10/31/08
to
> > =A0 =A0I'm confused about how to sort a list on an element of the list's
> > structure. =A0Here is my data definition:
> >
> > struct Finishes =A0 =A0 =A0 =A0 =A0 =A0 =A0 // computed Finish information
> > {
> > =A0 =A0 =A0 =A0 long =A0netTime;
> > =A0 =A0 =A0 =A0 int =A0 bibNumber;} fWork;
> >
> > typedef list<Finishes> FINISHES;
> > =A0 =A0 =A0 =A0 FINISHES finishInfo;
> > =A0 =A0 =A0 =A0 list<Finishes>::iterator fIter;
> >
> > =A0 =A0I have populated the list successfully, and now I want to sort the
> > list on the netTime element. =A0All examples of the list.sort I've found
> > work only with scalars or single-element structures. =A0How do I do this
> > with my data? =A0TIA

>
> Why not use an appropriate container like std::map where netTime is
> the key and the integer its values? Elements are then sorted on
> insertion using the default comparator less<>.

I don't have a need for that. My application just produces Times &
assigns them to bibNumbers; I just need a dynamic array of such data (a
list is fine), and then I sort the data on Time. I don't need to access
any object members randomly, because once I've sorted the array I will
process all objects in that sequence.

James Kanze

unread,
Nov 1, 2008, 4:38:42 AM11/1/08
to
On Oct 31, 9:58 pm, mrc2...@cox.net (Mike Copeland) wrote:
> > >    I'm confused about how to sort a list on an element of the list's
> > > structure.  Here is my data definition:

> > > struct Finishes               // computed Finish information
> > > {
> > >         long  netTime;

> > >         int   bibNumber;} fWork;

> > > typedef list<Finishes> FINISHES;


> > >         FINISHES finishInfo;
> > >         list<Finishes>::iterator fIter;

> > > I have populated the list successfully, and now I want to
> > > sort the list on the netTime element.  All examples of the


> > > list.sort I've found work only with scalars or

> > > single-element structures.  How do I do this with my data?
> > > TIA

> > Why not use an appropriate container like std::map where
> > netTime is the key and the integer its values? Elements are
> > then sorted on insertion using the default comparator
> > less<>.

> I don't have a need for that.  My application just produces
> Times & assigns them to bibNumbers; I just need a dynamic
> array of such data (a list is fine), and then I sort the data
> on Time.  I don't need to access any object members randomly,
> because once I've sorted the array I will process all objects
> in that sequence.

Actually, unless you need to insert at random locations in the
middle, std::vector or std::deque are probably more appropriate;
I'd probably go with std::vector in your case, since you can do
all your insertions at the end. std::map and std::set become
interesting when you have to maintain order with ongoing
insertions.

Anyway, as others have probably already said (I haven't seen the
other responses), all you need is to define the appropriate
comparator. Something like:
struct CompareTimes
{
bool operator()(
Finishes const& lhs,
Finishes const& rhs ) const
{
return lhs.netTime < rhs.netTime ;
}
} ;
and pass an instance of this to the appropriate sort routine.

--
James Kanze (GABI Software) email:james...@gmail.com
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34

0 new messages