Seite 1 von 1

Wie das erste Element aus QMap löschen (tricky!)

Verfasst: 20. Oktober 2007 10:11
von crash
Ich muss das erste Element aus einer QMap löschen...

Code: Alles auswählen

qmap.remove(qmap.begin());
bringt leider nichts, da die Suche nach dem Element (der Iterator aus begin()) über den Ist-Kleiner-Operator läuft.

Nur: den Op hab ich überladen und aufgrund von numerischen Ungenauigkeiten findet er in seltenen Fällen nicht das zu löschende Element. Also brauche ich eine Möglichkeit, direkt das erste Element zu löschen, wie gesagt: ohne Vergleichs-Operatoren (daher scheiden find o.ä. erstmal aus). Ein simples remove(0) gibts nämlich leider auch nicht.

Konvertierung in eine QList und anschliessendes Neubauen der QMap halte ich für zeit-kritisch.

Ohnehin verstehe ich nicht, wieso ein const-Iterator auf Begin() trotzdem erst gesucht werden muss :?: :?:

Ideen?

Verfasst: 20. Oktober 2007 10:36
von Christian81
Eine map hat keine Reihenfolge. Die wird ggf. nur durch deinen operator festgelegt. Wenn dein Operator falsch ist kann QMap ja nichts dafür.
Ich glaube also dass QMap für deine Aufgabe der falsche Container ist.

Verfasst: 20. Oktober 2007 11:14
von crash
Nun, die Map hat logarithmische Einfüge- und Suchzeiten garantiert.

Eine Liste wäre sicherlich intuitiver, aber die Laufzeit würde mich killen...

Der Operator ist grundsätzlich nicht falsch, sondern arbeitet nur mit Ungenauigkeiten (sortiert Punkte nach aufsteigenden x-y-Koordinaten und berücksichtigt dabei noch den epsilon-Vergleich von double-Werten).

Verfasst: 20. Oktober 2007 12:19
von crash
Hmm, ich habs doch auf QList umgestellt.

Mit ein bisschen Trickserei (qBinaryFind etc) konnte ich die jeweils erneute Sortierung der Listen nach einem Einfügen umgehen.

Sollte jetzt auch so gehen, obwohl die Frage immer noch unbeantwortet wäre ;)