Letztes Suchelement in Liste löschen
-
Hallo,
ich habe eins std::list<std::pair<int, int> >, die Bildschirmkoordinaten enthält. Die Koordinaten beschreiben Punkte, die man setzen und löschen kann.
Setzen ist einfach, mit push_back, aber das Löschen bereitet mir Probleme. Für den Fall, dass zwei Punkte (5² Pixel groß) übereinander liegen oder sich überschneiden, soll der oberste Punkt gelöscht werden, der in der Liste also am weitesten hinten liegt.
Die Liste könnte man mit einem reverse-iterator ja gut durchlaufen, und überprüfen, ob für einen Punkt die Bedingungen zutreffen, dass die Maus auf ihm liegt. Aber wie lösche ich das Element dann? erase erwartet einen normalen iterator. Ich bekomme es aber nicht gebacken, auf einen normalen Iterator zu casten, bzw. einen normalen Iterator kann ich auch nicht dekrementieren, um die Liste rückwärts zu durchlaufen.
Wie löst man das am besten?
Danke & mfg!
-
Warum speicherst du Bildschirmkoordinaten in ner Liste? Nimm doch einfach ein Array mit der größe des Bildschirms und setz dann z.B. per enum Werte.
-
Naja, eine Liste erscheint mir recht passend...
Einfach ein Array mit den Bildschirmkoordinaten gefällt mir gar nicht, was wenn ich später mal eine Scrollfunktion in meiner Anwedung habe, dann benötige ich ein verdammt großes Array. Und die meisten Array-Elemente wären dann einfach leer, müsste trotzdem das gesamte Array durchlaufen um die Punkte zu rendern!
Was meinst du genau mit "per enum Werte setzen?"
-
Letztens in nem Forum gefunden:
http://img184.imageshack.us/img184/426/containerchoicecw8.png
-
Aber wie lösche ich das Element dann? erase erwartet einen normalen iterator. Ich bekomme es aber nicht gebacken, auf einen normalen Iterator zu casten, bzw. einen normalen Iterator kann ich auch nicht dekrementieren, um die Liste rückwärts zu durchlaufen.
Mittels "reverse_iterator::base()" erhältst du wieder einen "iterator", den du dann für erase verwenden kannst.
-
Danke für den Tipp mit reverse_iterator::base()
Leider zeigt der Iterator nicht direkt auf das selbe Element, deshalb dekrementiere ich den Iterator, den mir base() zurückliefert. Aber warum geht das überhaupt?! Wenn es ein normaler Iterator ist, kann ich ihn doch eigentlich gar nicht inkrementieren, aber das funktioniert tadellos?
points.erase(--revIter.base());
(D)Evil: Ist zwar eine schöne Grafik, aber kannst du mir bitte noch etwas näher erleutern, worauf du hinaus willst? Ich finde eine Liste ist der passenste Container, Vektoren hätten sonst ja auch den Nachteil, dass sie neu geschrieben werden müssen, wenn ich ein Element in der Mitte lösche...
-
*push*
-
Suche elegante Lösung schrieb:
(D)Evil: Ist zwar eine schöne Grafik, aber kannst du mir bitte noch etwas näher erleutern, worauf du hinaus willst? Ich finde eine Liste ist der passenste Container, Vektoren hätten sonst ja auch den Nachteil, dass sie neu geschrieben werden müssen, wenn ich ein Element in der Mitte lösche...
Wie oft passiert das denn? Eine gute Faustregel ist: Verwende immer einen Vektor, es sei denn, es zeigt sich im Gebrauch, dass das Löschen und Einfügen in der Mitte zu oft passiert.
Zum Problem: kann ich nicht nachvollziehen. Wieso sollte das nicht gehen?
-
Was ist eigentlich der Sinn des ganzen. Was soll das Programm machen?
-
Hmm gut, also handelt es sich bei dem Iterator von ::base() um einen bidirectional_iterator? Die Faustregel hab ich schonmal wo gehört, aber andererseits... was spricht dagegen, die Container näher kennen zu lernen und sich so vllt. in deren Selektion zu üben?

midnight: Einfach die Möglichkeit bieten, Punkte auf dem Bildschirm zu setzen und zu löschen.
Bin bisschen am rumspielen und lernen.