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);
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
*/
Yes, that works perfectly. Thanks!
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.
> > > 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