[C++] sort() sorteert niet goed?

Pagina: 1
Acties:

  • martennis
  • Registratie: Juli 2005
  • Laatst online: 27-11 19:57
ola,

ik had gister even snel een stukje code in elkaar geflanst, maar het werkt niet helemaal.
het programma leest woorden uit een bestand in een vector, waarna de vector iteratisch doorlopen wordt om de woorden op het scherm te zetten.

de uitkomst hiervan is het volgende:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
hallo
daar
gebruiker
van
harte
welkom
bij
de
wonderbaarlijke
wereld
van
C++
programmeren


nu laat ik hier een sort op los:

C:
1
sort(words.begin(), words.end());


wat het volgende resultaat heeft:

code:
1
2
3
4
C++
bij
daar
...


zoals je ziet staat de 'C++' voor het woord 'bij' ?!?
de rest van de woorden wordt wel goed gesorteerd

ik had op google al gezocht, maar ik vond alleen maar voorbeelden waar de sort wordt gebruikt :S

kan iemand mij uitleggen waarom mijn vector niet goed gesorteerd is?

  • Jrz
  • Registratie: Mei 2000
  • Laatst online: 14:27

Jrz

––––––––––––

A is kleiner dan a
A = 65 en a = 97

Je zou een moeten zoeken naar case-insensitive sort

[ Voor 136% gewijzigd door Jrz op 31-12-2006 11:11 ]

Ennnnnnnnnn laat losssssssss.... https://github.com/jrz/container-shell (instant container met chroot op current directory)


  • bro!
  • Registratie: September 2005
  • Laatst online: 21-07 02:42
Hoofdletter?

  • martennis
  • Registratie: Juli 2005
  • Laatst online: 27-11 19:57
oh okee!!
ik dacht dat de hoofdletter juist hoger was dan een kleine letter :$
dank!

edit: dank voor de tip jrz!

[ Voor 14% gewijzigd door martennis op 31-12-2006 11:13 ]


  • Depress
  • Registratie: Mei 2005
  • Laatst online: 24-11 21:01
Wat je kunt doen is je woorden in aan array zetten. Een 2e array met alles in lower case strings, die sorteren. Dan die doorlopen en op die manier de 1ste array in de goede volgorde zetten aan de hand van de 2e array.

  • Sendy
  • Registratie: September 2001
  • Niet online
Depress schreef op zondag 31 december 2006 @ 11:15:
Wat je kunt doen is je woorden in aan array zetten. Een 2e array met alles in lower case strings, die sorteren. Dan die doorlopen en op die manier de 1ste array in de goede volgorde zetten aan de hand van de 2e array.
Handiger lijkt mij om een functieobject toe te voegen aan de parameterlijst van sort().

  • MrBucket
  • Registratie: Juli 2003
  • Laatst online: 29-10-2022
Sendy schreef op zondag 31 december 2006 @ 11:26:
[...]

Handiger lijkt mij om een functieobject toe te voegen aan de parameterlijst van sort().
Mee eens. Uit de STL documentatie van SGI (http://www.sgi.com/tech/stl/functors.html):

C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
//Sort a vector of double by magnitude, i.e. ignoring the elements' signs. 
//In this example, the function object is an object of a user-defined class.

struct less_mag : public binary_function<double, double, bool> {
    bool operator()(double x, double y) { 
        //Dit bepaalt hoe de elementen gesorteerd worden.
        return fabs(x) < fabs(y);
    }
};

vector<double> V;
...
sort(V.begin(), V.end(), less_mag());

In het geval van TS heb je natuurlijk te maken met strings i.p.v. doubles, maar voor de rest illustreert het wel redelijk hoe je binnen zo'n function object de sortering kan bepalen.

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 14:52

.oisyn

Moderator Devschuur®

Demotivational Speaker

Ik denk dat een gewone functie handiger is dan een dergelijke struct ;)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • MrBucket
  • Registratie: Juli 2003
  • Laatst online: 29-10-2022
.oisyn schreef op zondag 31 december 2006 @ 14:08:
Ik denk dat een gewone functie handiger is dan een dergelijke struct ;)
Hoe bedoel je?

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 14:52

.oisyn

Moderator Devschuur®

Demotivational Speaker

Aangaande dat voorbeeld:
C++:
1
2
3
4
5
6
bool less_mag(double d1, double d2)
{
    return abs(d1) < abs(d2);
}

std::sort(v.begin(), v.end(), less_mag);

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.

Pagina: 1