QMap::contains() VS QMap::find()
Sehe ich oft code wie:
if(myQMap.contains("my key")){
myValue = myQMap["my key"];
}
die theoretisch führt zwei look-up in der QMap.
Meine erste Reaktion ist, dass es ersetzt werden soll, durch die folgenden, führt ein lookup nur und sollte zwei mal schneller:
auto it = myQMap.find("my key");
if(it != myQMap.end()){
myValue = it.value();
}
Frage ich mich, ob QMap macht diese Optimierung automatisch für mich?
In anderen Worten Frage ich mich, ob QMap speichert die position des letzten Elements gefunden mit QMap::contains()
und prüft es zuerst, bevor Sie das nächste lookup?
- Ziemlich sicher ist es nicht. Sie können die gleiche const QMap, die von mehreren threads verwendet, die würden ernsthafte Schwierigkeiten, wenn es waren caching überhaupt nichts (und selbst in der besten caching würde nur Arbeit für ein thread)
- Hier ist der Quellcode für
QMap
: qt.gitorious.org/qt/qt/source/... es ist nicht trivial zu Lesen, aber es sollte Ihnen helfen, eine Antwort zu bekommen, wenn Sie es wirklich wollen. - Ich würde erwarten, dass die meisten der Zeit eine QMap zugegriffen wird von einem thread, so dass, wenn die Optimierung funktioniert nur für einen thread ist es trotzdem Wert, es umzusetzen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich würde erwarten, dass QMap bietet sowohl Funktionen für eine bessere Schnittstelle der Klasse. Es ist natürlicher, Sie zu Fragen, wenn die Karte 'enthält' einen Wert mit einem angegebenen Schlüssel, als es ist, rufen Sie den 'suchen' - Funktion.
Wie der code zeigt, beide zu finden, und enthält, rufen Sie die folgende interne Funktionen: -
Also, wenn Sie gehen, um die zurückgegebenen iterator, dann mit suchen und überprüfen Sie den Rückgabewert, wird effizienter sein, aber wenn Sie wollen einfach nur wissen, ob der Wert existiert in der Karte, Aufruf enthält, ist besser für die Lesbarkeit.
Wenn du den Quellcode anschauen, werden Sie sehen, dass QMap ist implementiert als eine binäre Baumstruktur von Knoten. Aufruf findNode durchläuft die Knoten-und nicht-cache das Ergebnis.
QMap-source-code zeigt, dass es keinen speziellen code in
QMap::contains()
Methode.In einigen Fällen können Sie
QMap::value()
oderQMap::values()
um Wert für einen Schlüssel und überprüfen, ob es korrekt ist. Diese Methoden (und constoperator[]
) wird der Wert kopiert wird, aber das ist wohl OK für die meisten Qt-Typen seit Ihr zugrunde liegenden Daten sind kopiert-on-write (insbesondereQMap
selbst).