Sorting a list with class for complex types [modified]
-
Hello I have designed a program that takes in a list of structs of type data (shown below). The program works fine. But I need a way of sorting the list by decreasing length of string Sequence. In other words, I need to determine the length of each Sequence and position each data so that the longest strings appear first. So I am not comparing strings themselves, but lengths of strings. I know there is a sort function that is part of the <list> class, but I am not sure if I can use it in this situation. Thanks in advance for anyone who can come to a solution. HRW.
#include <string>
#include <list>
#include <iostream>
#include <fstream>using namespace std;
struct data //
{
string Length; //
string Sequence; //
string N_Terminal; //
string C_Terminal;
};list<data> g_DataList;
list<data>::iterator dataListIter;-- modified at 11:29 Monday 10th July, 2006
-
Harold, You'll do much better if you get (1) a copy of Stroustrup and (2) a copy of Josuttis. Read them in that order. Because what you want to do is trivial and will be explained by the first book; putting in the time for the second will be worth it. earl
Are these C++ authors of C++ books? I will look for them. I did not see anything in the Deitel & Deitel book that was too helpful.
-
Are these C++ authors of C++ books? I will look for them. I did not see anything in the Deitel & Deitel book that was too helpful.
-
Hello I have designed a program that takes in a list of structs of type data (shown below). The program works fine. But I need a way of sorting the list by decreasing length of string Sequence. In other words, I need to determine the length of each Sequence and position each data so that the longest strings appear first. So I am not comparing strings themselves, but lengths of strings. I know there is a sort function that is part of the <list> class, but I am not sure if I can use it in this situation. Thanks in advance for anyone who can come to a solution. HRW.
#include <string>
#include <list>
#include <iostream>
#include <fstream>using namespace std;
struct data //
{
string Length; //
string Sequence; //
string N_Terminal; //
string C_Terminal;
};list<data> g_DataList;
list<data>::iterator dataListIter;-- modified at 11:29 Monday 10th July, 2006
Simply define an ordering by implementing
operator <
. i.e.struct data { string Length; string Sequence; string N_Terminal; string C_Terminal; friend bool operator<(const data &L, const data &R) { // In this example I'm only sorting by 'Sequence' return L.Sequence<R.Sequence; } }; // Now you can sort like this. g_DataList.sort();
Steve -
Simply define an ordering by implementing
operator <
. i.e.struct data { string Length; string Sequence; string N_Terminal; string C_Terminal; friend bool operator<(const data &L, const data &R) { // In this example I'm only sorting by 'Sequence' return L.Sequence<R.Sequence; } }; // Now you can sort like this. g_DataList.sort();
SteveSo after creating the list, doesn't the sort function take in one parameter of type data? And will the list be printed in sorted order after the sort function is invoked?
-
So after creating the list, doesn't the sort function take in one parameter of type data? And will the list be printed in sorted order after the sort function is invoked?
The
list
already knows the type of the data it contains. There are two member functions oflist
calledsort
: one with no parameters and one which takes a predicate. I'm using the one which takes no parameters and overloadingoperator <
. Give it a try and see if it works for you. Steve -
Hit up amazon for those two. Stroustrup largely invented C++ and wrote one of the definitive books on it; Josuttis wrote a book on the standard library that is a great complement to the former.
I did check amazon and saw several books by Stroustrup. Do you know the title of the book? -- modified at 21:13 Monday 10th July, 2006
-
Simply define an ordering by implementing
operator <
. i.e.struct data { string Length; string Sequence; string N_Terminal; string C_Terminal; friend bool operator<(const data &L, const data &R) { // In this example I'm only sorting by 'Sequence' return L.Sequence<R.Sequence; } }; // Now you can sort like this. g_DataList.sort();
SteveThanks! This really helps because my goal is to actually compare the string length of the Sequence variable and assign that value to int Number as I have it defined below:
struct data //
{
int Number;
string Length;
string Sequence;
string N_Terminal;
string C_Terminal;
friend bool operator<(const data &L, const data &R)
{
return L.number > R.number;
}};
Then I invoke the sort after the list has been populated with items.
g_DataList.sort();
You will notice I overloaded the > operator instead of the < operator since I need the longest strings to appear first. The thing I do not quite get is how the compiler knows what const data &L and const data &R are when they are passed by reference in the friend function. I'm not making the connection between the comparison and the sort function? Perhaps I do not understand the sorting algorithym. I confess my lack of programming experience even though I have the program working like a champ at this stage. Regards, HRW. :) -- modified at 4:40 Tuesday 11th July, 2006
-
Thanks! This really helps because my goal is to actually compare the string length of the Sequence variable and assign that value to int Number as I have it defined below:
struct data //
{
int Number;
string Length;
string Sequence;
string N_Terminal;
string C_Terminal;
friend bool operator<(const data &L, const data &R)
{
return L.number > R.number;
}};
Then I invoke the sort after the list has been populated with items.
g_DataList.sort();
You will notice I overloaded the > operator instead of the < operator since I need the longest strings to appear first. The thing I do not quite get is how the compiler knows what const data &L and const data &R are when they are passed by reference in the friend function. I'm not making the connection between the comparison and the sort function? Perhaps I do not understand the sorting algorithym. I confess my lack of programming experience even though I have the program working like a champ at this stage. Regards, HRW. :) -- modified at 4:40 Tuesday 11th July, 2006
A friend function is really a global function, not a member function. This would be clearer if the declaration and the definition were separated as is shown below:
struct data { int Number; string Length; string Sequence; string N_Terminal; string C_Terminal; friend bool operator<(const data &L, const data &R); // Declaration. }; // Definition. bool operator<(const data &L, const data &R) { return L.number > R.number; }
In this example the function doesn't even need to be made a friend as it doesn't access anyprotected
orprivate
members. With this modification it looks like this:struct data { int Number; string Length; string Sequence; string N_Terminal; string C_Terminal; }; bool operator<(const data &L, const data &R) { return L.number > R.number; }
When the compiler sees a<
and one or both of the parameters (the expressions to the left and right of the<
) is a user defined type it looks for a user definedoperator<
. It chooses from all the candidates by matching the types in the expression it is compiling with the types of the operator. Steve -
I did check amazon and saw several books by Stroustrup. Do you know the title of the book? -- modified at 21:13 Monday 10th July, 2006