c++ map
-
Hey Leute, ich wollte mal fragen ob es eine Möglichkeit gibt, dass wenn ich einen Eintrag mitten aus einer map lösche, den Inhalt irgendwie aufrücken kann.
Also praktisch:
xxxxxxxxxxxxxxx : Nun lösche ich einen Eintrag in der Mitte
xxxxx-xxxxxxxxx : So sieht das dann aus
xxxxxxxxxxxxxx : Und so möchte ich das habenVielen Dank im vor raus

-
Möchtest Du, dass die Keys der danach folgenden Einträge jeweils dekrementiert werden (falls es sich um eine Zahl handelt) oder geht es dir um speichertechnische Änderungen? Wenn du durchiterierst, solltest Du keine Lücke finden.
-
Naja, also genaugenommen lösche ich per zufallswert einen Eintrag aus der Map, aber da der Zufallswert ja nochmal den Wert bekommen kann, der Eintrag aber dann nicht mehr existiert, bekomme ich ja einen ziemlich unschönen Fehler.
Also so in etwa:
int inhalt; int rnd; map<int, string> platzierung map<int, string>::iterator i; pair<int, string> spieler spieler = make_pair (1, "Test"); // Um die zwanzig Einträge platzierung.insert(spieler); ... inhalt = static_cast<int>(platzierung.size()); srand((unsigned) time(NULL)); rnd = rand() % inhalt + 1; platzierung.erase(rnd);Und das läuft halt innerhalb einer Schleife, da die Zufallszahl aber auch nochmal den selben Wert haben kann, dieser Eintrag dann aber gelöscht ist, funktioniert das ja nicht mehr, deswegen müsste ich das gesamte irgendwie so aufrücken, dass wenn beispielsweise der 15te Wert gelöscht wird, der 16te usw alles nach unten rutscht so, dass der 15te Wert wieder belegt ist.
-
Erstens solltest du 'srand' nur einmalig am Anfang deines Programms aufrufen (sonst erhältst du immer wieder dieselben Zufallszahlen, falls du die Schleife je Sekunde öfters aufruft) und zweitens einfach
inhalt = static_cast<int>(platzierung.size());auch jeweils innerhalb der Schleife beachten (oder aber 'inhalt' jedesmal um 1 dekrementieren).
-
Erstens solltest du 'srand' nur einmalig am Anfang deines Programms aufrufen (sonst erhältst du immer wieder dieselben Zufallszahlen, falls du die Schleife je Sekunde öfters aufruft) und zweitens einfach
inhalt = static_cast<int>(platzierung.size());auch jeweils innerhalb der Schleife beachten (oder aber 'inhalt' jedesmal um 1 dekrementieren).
Edit:
du solltest dann einfach die 'void erase(iterator position)'-Funktion benutzen (mittels std::advance(platzierung.begin() + rnd), wobei du dann nurrnd = rand() % inhalt;benutzen solltest (d.h. rnd geht von 0 bis size()-1).
Edit: da hat wohl irgendwie das 'Edit' hier im Forum nicht geklappt...
-
Vielen Dank, hat wunderbar geklappt
