Entfernen Sie doppelte Objekt aus QList
Ich habe eine QList<MyData>
, wo MyData
2 Mitglied int id
(einmalig) und QString name
. Ich möchte entfernen Sie alle doppelten Einträge basierend auf name
, und dieser Eintrag muss den höchsten id
zwischen anderen Objekt mit dem gleichen name
. Jeder Vorschlag, wie zu tun es auf dem schnellsten Weg? Performance ist ein sehr wichtiger Faktor hier.
Einige von meiner Idee, nach dem Google-ed für den ganzen Tag:
qStableSort()
es basiert auf der id (absteigend), dann eine Schleife durch dieQList
, dann für jeden Eintrag, kopieren Sie den Eintrag auf einen anderen neuenQList
wenn diename
ist nicht vorhanden auf dem neuenQList
- verwenden
QList::toSet
(die alle entfernen doppelter Eintrag), und die operator==() und ein qHash () - Implementierung basiert aufname
, aber der Eintrag eindeutig ist, möglicherweise nicht die höchste id - verwenden
std::list::unique
, aber ich bin mir nicht sicher, wie es funktioniert.
- Unter Verwendung der standard-C++ - Bibliotheken-Funktionalität (entweder
std::list::unique
oder die Allgemeinestd::unique
- Funktion) bedeutet, Sie müssen kopieren der Daten in einen standard-container, und dann kopieren Sie Sie zurück auf dieQList
.
InformationsquelleAutor Dickson | 2013-01-14
Schreibe einen Kommentar Antworten abbrechen
Du musst angemeldet sein, um einen Kommentar abzugeben.
std::list::unique
kann als argument eine Funktion mit den folgenden Eigenschaften:Also in Ihrem Fall könnten Sie die folgende Funktion:
Nenne es einfach tun,
Beachten Sie, dass Sie benötigen, um zu Sortieren zuerst die
std::list
Bearbeiten
Es scheint, dass Sie verwenden können
std::unique
mitQt containers
(wennQt
ist gebaut mit STL-support). So auch in diesem Fall können Sie Folgendes tun:Wie wäre es damit:
Der Vorteil dieser, in meinen Augen: Sie müssen nicht konvertieren Sie die Liste in eine
std
-container und zurück, und wenn Sie einen Weg finden, weiter zu arbeiten mit derQMap
statt einerQList
, haben Sie nur zu iterieren, einmal über die Liste. UndQHash
geben Sie abgeschriebenO(1)
lookup Komplexität.Edit: Geändert
QHash
.MyData
. Meine schlechten 🙁QHash<QString, MyData>
, und ändern Sie dann dieif
-Anweisung ist die zweite Bedingung:iter.second.id > element.id
. Oder vielleichtMyData*
in die QHash, um zu vermeiden, kopieren Sie alle MyDatas.Ich Tat dies, indem STL-Container, aber ich denke, es ist nicht sehr schwer zu konvertieren, es zu Qt-Container
gehören
http://liveworkspace.org/code/wOFnM$5
theSet
in meinem Beispiel von der lambda ? Dank