Sorting a list Structure

M

Mike Copeland

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
 
J

Juha Nieminen

Mike said:
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

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);
 
S

Salt_Peter

   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<>.

#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
*/
 
M

Mike Copeland

I have populated the list successfully, and now I want to sort the
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!
 
M

Mike Copeland

=A0 =A0I'm confused about how to sort a list on an element of the list's
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.
 
J

James Kanze

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.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,772
Messages
2,569,592
Members
45,103
Latest member
VinaykumarnNevatia
Top