C++ STL Liste Elemente löschen
alexsb 03.04.2004 - 19:29 1077 7
alexsb
hmm
|
Hi, ich möchte, während ich über eine STL Liste iteriere Elemente der selben Liste löschen. Ist das möglich, oder bringe ich da den Iterator durcheinander?
thx,
Alex
|
mat
AdministratorLegends never die
|
ja.. du löscht ja mit dem iterator und der wird dann ungültig.
|
alexsb
hmm
|
Ok danke, wie kann ich dann, möglichst effizient eine Liste die 4000 Pairs mit je zwei double Werten beinhaltet von Duplikaten bereinigen? Ich hätte gedacht, ich sortiere das ganze zuerst, und dann lösche ich die doppelten, aber ich weiss weder wie ich das lösche noch wie ich das sortiere, sort kann ich ja soweit ich weiß nicht auf die Pairs anwenden. Eventuell ist die Datenstruktur auch nicht optimal, gibts da bessere Vorschläge?
|
mat
AdministratorLegends never die
|
.remove(value)
noch besser wäre unique()
|
alexsb
hmm
|
hmm, funktioniert das auch mit nicht primitiven listenelementen, wie in meinem fall?
edit: ja, es funktioniert *freu*
Noch eine Frage, wie kann ich das jetzt abhängig vom ersten oder vom zweiten Wert des Pairs sortieren? Geht das?
tia
Bearbeitet von alexsb am 03.04.2004, 20:20
|
mat
AdministratorLegends never die
|
nimm einen der sortalgorithmen und schreib dir eine passende compare funktion. findest alles in etlichen stl references (zB http://www.sgi.com) edit: http://www.sgi.com/tech/stl/sort.htmltemplate <class RandomAccessIterator> void sort(RandomAccessIterator first, RandomAccessIterator last);
template <class RandomAccessIterator, class StrictWeakOrdering> void sort(RandomAccessIterator first, RandomAccessIterator last, StrictWeakOrdering comp);
The two versions of sort differ in how they define whether one element is less than another. The first version compares objects using operator<, and the second compares objects using a function object comp
|
Ringding
Pilot
|
Man kann sehr wohl aus der Liste loeschen, waehrend man darueber iteriert. Der einzige Iterator, der beim Loeschen ungueltig wird, ist der auf das geloeschte Element zeigende, man kann also sowas machen: iteratortype it2 = it;
++it;
l.erase(it2);
Und dann ganz normal mit it weitermachen.
|
alexsb
hmm
|
naja, hätte geholfen, aber ich hab mir inzwischen eine andere Datenstuktur zugelegt, die wesentlich performanter ist. Ist jetzt eine Map, in der nur die Einzigartigen überhaupt eingetragen werden. Danke auf jeden Fall.
|