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

Alles rund um die Programmierung mit Qt
Antworten
crash
Beiträge: 9
Registriert: 15. Februar 2006 15:25

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

Beitrag 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?
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag 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.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
crash
Beiträge: 9
Registriert: 15. Februar 2006 15:25

Beitrag 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).
crash
Beiträge: 9
Registriert: 15. Februar 2006 15:25

Beitrag 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 ;)
Antworten