Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

23.06.2010, 14:17

Letztes Element einer Multimap ansprechen

Hey, ich hab mal wieder ein Problem, dass ich nicht lösen kann.

Und zwar geht es um Multimaps. Ich möchte eine Highscore - Liste in einer Multimap erstellen und dabei den höchsten Punktestand als erstes ausgeben. Zu diesem Zweck wollte ich die Multimap einfach von hinten nach vorne durchlaufen lassen und die Punkte als Key verwenden.
Meine Frage ist nun allerdingst, wie ich das letzte Element in einer Multimap ansprechen kann (Da meine Vorschleife dor anfangen muss zu zählen).
Mit der Funktion .end() funktioniert es natürlich nicht, da diese Funktion meines Wissens nach nur überprüft, ob das Ende der Map erreicht ist, aber nicht die Position der letzten Elements zurückliefert.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include <iostream>
#include<map>

using namespace std;

int main()
{
    multimap<int,string> mapList; //Die Map mit den Daten
    multimap<int,string>::iterator Iterator; //Iterator für die map
    pair<int,string> pair; //Die Paare

    //Liste mit Daten füllen
    pair = make_pair(500,"Player 1");
    mapList.insert(pair);

    pair = make_pair(900,"Player 2");
    mapList.insert(pair);

    pair = make_pair(400,"Player 3");
    mapList.insert(pair);

    pair = make_pair(800,"Player 4");
    mapList.insert(pair);


    //Liste sotiert ausgeben
    cout << "Liste sortiert:\n";

    for(Iterator =  mapList.end(); Iterator != mapList.begin(); Iterator--) //Was muss ich hier für einen Anfangswert geben?
    {
        cout << Iterator -> first << " : " << Iterator -> second.c_str() << endl;
    }

    return (0);
}


Ich habe auch schon versucht, das letzte Element über die .size() Funktion zu bekommen, nur weiß ich dann nicht, wie ich dieses Element ansprechen kann, da hier die Zahl 4 nur bedeuten würde, dass es 4 Elemente sind, aber nciht den Key zurückliefert, mit dem ich dann den Iterator füllen könnte (mit .find() z.B.).

Liebe Grüße
Ombalat

2

23.06.2010, 14:20

Mach doch einfach:

C-/C++-Quelltext

1
2
for(Iterator = mapList.begin(); Iterator != mapList.end(); ++Iterator);
cout << Iterator;

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

3

23.06.2010, 14:20

rbegin() liefert dir einen reverse_iterator der die map von hinten nach vorne durchläuft.
Allerdings wärs vielleicht noch besser einfach greater als Comparator für die map zu verwenden und die Elemente so gleich in der "richtigen" Reihenfolge zu speichern...

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

4

23.06.2010, 14:25

wenn du den iterator von hinten an durch gehen willst kannst du rbegin() benutzen.
http://www.cplusplus.com/reference/stl/map/

edit: zu langsam ^^
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

5

23.06.2010, 15:03

Mach doch einfach:

C-/C++-Quelltext

1
2
for(Iterator = mapList.begin(); Iterator != mapList.end(); ++Iterator);
cout << Iterator;
Dann würde ich die liste von Vorne nach hinten durchlaufen lassen, und dass will ich ja nich ;)

rbegin() liefert dir einen reverse_iterator der die map von hinten nach vorne durchläuft.
Allerdings wärs vielleicht noch besser einfach greater als Comparator für die map zu verwenden und die Elemente so gleich in der "richtigen" Reihenfolge zu speichern...
Danke, habs jz mit dem ReverseIterator gemacht und es Funktioniert.

C-/C++-Quelltext

1
2
3
4
5
multimap<int,string>::reverse_iterator ReIterator;
for(ReIterator =  mapList.rbegin(); ReIterator != mapList.rend(); ReIterator++)
    {
        cout << ReIterator -> first << " : " << ReIterator -> second.c_str() << endl;
    }


Und auch Danke an NachMan :)

Mich würde interessieren, wie es mit dem greater funktionieren würde? Aus dem Link werd ich iwie nicht Schlau ...

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

6

23.06.2010, 15:10

Das würde dann z.B. so aussehen:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
#include <functional>
#include <string>
#include <map>


int main()
{
  typedef std::multimap<int, std::string, std::greater<int> > score_map;
  score_map highscore;

  highscore.insert(std::make_pair(500, "Player 1"));
  highscore.insert(std::make_pair(900, "Player 2"));
  highscore.insert(std::make_pair(400, "Player 3"));
  highscore.insert(std::make_pair(800, "Player 4"));

  //Liste sotiert ausgeben
  std::cout << "Liste sortiert:\n";

  for(score_map::const_iterator score = highscore.begin(); score != highscore.end(); ++score)
    std::cout << score->first << " : " << score->second << std::endl;

}

7

23.06.2010, 16:18

Ein wenig erklärung dazu wäre nicht schlecht :S


typedef std::multimap<int, std::string, std::greater<int> > score_map;
score_map highscore;

Was passiert hier? Vor allem bei "score_map highscore;" ?

highscore.insert(std::make_pair(500, "Player 1"));
highscore.insert(std::make_pair(900, "Player 2"));
highscore.insert(std::make_pair(400, "Player 3"));
highscore.insert(std::make_pair(800, "Player 4"));

Hier füllt man einfach die Liste, nehme ich mal an

for(score_map::const_iterator score = highscore.begin(); score != highscore.end(); ++score)
std::cout << score->first << " : " << score->second << std::endl;
Ich sehe da keinen Unterschied zum normalen auflisten. Wieso zählt er hier plötzlich rückwärts, es wird doch ein normaler
(const) iterator erzeugt ?
Dieses greater ist für mich vollkommen neu :rolleyes:

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

8

23.06.2010, 16:24

mit hilfe der funktion( std::greater<int> ) kannst du definieren wie die map sortiert wird.
beim einfügen wird das element automatisch an der richtigen stelle eingefügt.

Zitat

Was passiert hier? Vor allem bei "score_map highscore;" ?

dort benutzt er das typedef.
alternativ kannst du es natürlich auch so schreiben:

C-/C++-Quelltext

1
std::multimap<int, std::string, std::greater<int> > highscore;

aber wenn du diese art von multimap öfter brauchst sparst du dir mit typedef ne menge tipparbeit.
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

9

23.06.2010, 17:23

Oke, Verstehe.
Eine Unklarheit hab ich noch:

mit hilfe der funktion( std::greater<int> ) kannst du definieren wie die map sortiert wird.
Also ... Das greater<int> sagt aus, dass die map nach einem Integer sortiert wird. Nur ...


beim einfügen wird das element automatisch an der richtigen stelle eingefügt.
... Fügt er es jetzt automatisch immer in absteigender Reihenfolge an? Oder muss man ihm noch iwie mitteilen, in welcher Reihenfolge, bzw nach welchen Kriterien er sortieren soll?

Den Rest hab ich Verstanden, danke schon mal :)

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

10

23.06.2010, 17:28

nach dots aussage passiert das automatisch.
std::greater<int> ist das kriterium
http://www.sgi.com/tech/stl/greater.html
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

Werbeanzeige