Vektor sortieren - Problem

Brisingr

Grünschnabel
Hallo Leute, ich hab mal wieder nen Problem, bei dem ihr mir hoffentlich helfen könnt :)

Ich wollte ein kleines Programm schreiben, dass eine kleine Highscoreliste erstellt.
(Ist jetzt ein wenig schwer zu erklären, aber ich hoffe ihr versteht was ich in meinen folgenden Ausführungen meine , zum erklären verwende ich ein paar Programmauszüge (; )

Und zwar sollten meine Eingaben in ein Vektor gelesen werden,dazu hab ich ein neuen Datentyp geschrieben, damit die Werte sozusagen "zusammen sind".

Code:
struct name_score	/* name_score definieren, späterer vector-Datentyp -- 2 Werte , Name+dazugehörige Punktzahl */
{
	string name; 
	int score;
	name_score(string n, int s) :name(n), score(s){}
};

Dann lese ich halt die Werte ein...

Code:
vector<name_score>save;

	while(cin >> name >> score)
	{
				
			if(name==exit && score==null) break;
			save.push_back(name_score(name,score)); 
		
	}

(z.B. Max 100
Ich 141
usw....)

So jetzt zu meinem Problem, ich wollte die Daten dann in eine Textdatei schreiben und sie beim nächsten öffnen wieder aus der Datei einlesen damit die Highscoreliste wieder ausgegeben wird...
Natürlich wollte ich die Daten sortiert in die Datei schreiben, Wie mach ich das am besten?

So in der Art: (aber das funktioniert so nicht)
Code:
sort(save.score.begin(),save.score.end());

Dass halt der Name mit den meisten Punkten ganz oben steht...

Danke im Voraus für die (hoffentlich schnelle (; )Hilfe :)
 
http://www.cplusplus.com/reference/algorithm/sort/

Das Einfachste wird sein, wenn du eine Callback-Funktion / -Klasse schreibst, welche als Argument 2 name_score nimmt und entsprechend das Feld score vergleicht. Vielleicht funktioniert es auch schon wenn du in name_score die entsprechenden Operatoren überlädst. Da bin ich mir allerdings unsicher.

C++:
bool compare(const name_score* a, const name_score* b)
{
         return b->score < a->score;
}


// ...
sort(scores.begin(), scores.end(), compare);
 
Zuletzt bearbeitet:
Danke erst mal für die Antwort :)
Bin noch ziemlicher c++ Anfänger , kannst du das bitte ein bisschen erklären?, wäre nett (;
 
Was soll ich da noch erkären?^^ Das kleine Beispiel im Verbindung mit dem Link sollte eindeutig sein. Du rufst die sort-Funktion mit einem 3. Parameter, einer eigenen Sortierfunktion (hier: compare()) auf.

Du schreibst dir also die Funktion in deine CPP und passt den sort()-Aufruf an.

Edit: Sehe jetzt erst, dass dein sort()-Aufruf ganz falsch ist. begin() und end() gibt es nur für die STL-Container. Daher kannst du also nur
Code:
sort(save.begin(), save.end(), compare)
benutzen.
 
Ein "so funktioniert es nicht" ist keine präzise Angabe ;) Was genau funktioniert denn nicht? Kompilerfehler? Sortierfehler?
 
Kompilierfehler :)

Habs jetzte geändert, jetzt funktionierts :D



Code:
bool compare(const name_score* a, const name_score* b)
{
         return b->score < a->score;
}

zu

Code:
bool compare(const name_score&a, const name_score& b)
{
         return b.score < a.score;
}

Da liegt der Fehler - du warst evtl. bei der falschen Sprache? :D

Das mit der Pass-by-const-reference hatte ich mir schon vorher gedacht und hatte das geändert. Mit den -> ist mir grade erst aufgefallen (;
Deswegen wollte ich auch, dass du mir das "erklärst", weil * und -> für mich kein Sinn ergeben hatten / mir unbekannt waren (;
 
Ich hab ja gesagt, dass ich Anfänger bin, probiere erst seit 1 Monat C++ zu lernen und komme auch nicht soo zügig voran wegen Schule (;
 
Habe übersehen, dass du nicht mit Pointer (new ClassName() erzeugt ein Pointer auf ein Objekt) arbeitest. Sorry für die Verwirrung.
Schön wenn es nun funktioniert.

Ich stimme aber auch sheel zu: Du musst dir unbedingt bei Gelegenheit anschauen, was es mit Pointer/Zeiger auf sich hat.
 
Zurück