Löschen final member von std::set
Wie lösche ich das Letzte Element aus einem set?
Beispiel:
set<int> setInt;
setInt.insert(1);
setInt.insert(4);
setInt.insert(3);
setInt.insert(2);
Wie kann ich löschen 4
aus setInt
? Ich habe versucht, so etwas wie:
setInt.erase(setInt.rbegin());
aber ich erhielt eine Fehlermeldung.
- Doh, hast Recht, ich vergaß Satz nicht random-access-iterator. Verwenden
setInt.erase(std::prev(setInt.end()));
Du musst angemeldet sein, um einen Kommentar abzugeben.
Durch die Art und Weise, wenn Sie das tun eine Menge (hinzufügen von Dingen, die zu einer Reihe, in beliebiger Reihenfolge, und dann entfernen des obersten element), könnten Sie auch einen Blick auf
std::priority_queue
sehen Sie, ob für Ihre Verwendung.if
war einfor
Schleife aus irgendeinem Grund...in C++11
Können Sie entscheiden, wie Sie wollen, um Fälle zu behandeln, wo die leer ist.
Ich würde vorschlagen, mit einem anderen Namen für
rbegin
die eine ordnungsgemäße Typ:Vorausgesetzt, Sie überprüft haben, dass
setInt
ist nicht leer!Btw. dies funktioniert, da können Sie rufen Sie die mutierenden Dekrement-operator auf eine temporäre (Typ
std::set<int>::iterator
). Diese temporäre weitergegeben werden müssen, um die erase-Funktion.std::vector<int>::iterator
gibt es keine Möglichkeit, dassstd::set<int>::iterator
kann ein Zeiger. Es muss eine Klasse geben, so dass Provisorien müssen decrementable.Etwas weniger performant, aber eine alternative option:
Wenn Sie löschen möchten 4 statt der zuletzt sollten Sie die Verwendung der find-Methode.
Je nach use case 4 wahrscheinlich nicht die letzten.
Wenn Sie wollen, löschen Sie das Letzte element verwenden:
Während ich nicht sicher war, ob --*.end(); ist O. K. ich habe etwas zu Lesen.
So -- auf rbegin().base() führt zum gleichen Ergebnis wie die-auf beenden().
Und beide funktionieren sollte.
Überprüfen, ob das set leer ist oder nicht. Wenn nicht, dann Holen Sie das Letzte element, und legen das als iterator und reduzieren den iterator zu löschen und das Letzte element ist.