J'ai des chaînes std :: contenant des nombres dans la section principale que j'ai besoin de trier. Les nombres peuvent être des entiers ou des flottants. Le tri vector<std::string>
n'était pas optimal, j'ai trouvé le programme de tri naturel suivant qui était bien meilleur. J'ai toujours un petit problème avec des nombres plus petits que zéro qui ne trient pas juste. Quelqu'un at-il une suggestion à améliorer? Nous utilisons Visual Studio 2003.comment améliorer le programme de tri naturel pour les décimales?
Le programme complet suit.
TIA, Bert
#include <list>
#include <string>
#include <iostream>
using namespace std;
class MyData
{
public:
string m_str;
MyData(string str) {
m_str = str;
}
long field1() const
{
int second = m_str.find_last_of("-");
int first = m_str.find_last_of("-", second-1);
return atol(m_str.substr(first+1, second-first-1).c_str());
}
long field2() const
{
return atol(m_str.substr(m_str.find_last_of("-")+1).c_str());
}
bool operator < (const MyData& rhs)
{
if (field1() < rhs.field1()) {
return true;
} else if (field1() > rhs.field1()) {
return false;
} else {
return field2() < rhs.field2();
}
}
};
int main()
{
// Create list
list<MyData> mylist;
mylist.push_front(MyData("93.33"));
mylist.push_front(MyData("0.18"));
mylist.push_front(MyData("485"));
mylist.push_front(MyData("7601"));
mylist.push_front(MyData("1001"));
mylist.push_front(MyData("0.26"));
mylist.push_front(MyData("0.26"));
// Sort the list
mylist.sort();
// Dump the list to check the result
for (list<MyData>::const_iterator elem = mylist.begin(); elem != mylist.end(); ++elem)
{
cout << (*elem).m_str << endl;
}
return 1;
}
GOT:
0.26
0.26
0.18
93.33
485
1001
7601
ATTENDUS:
0.18
0.26
0.26
93.33
485
1001
7601
Brillant, cela fonctionne. – Quadmore