Iterieren über eine QMap mit für
Habe ich eine QMap
Objekt und ich bin versucht, zu schreiben dessen Inhalt in eine Datei.
QMap<QString, QString> extensions;
//..
for(auto e : extensions)
{
fout << e.first << "," << e.second << '\n';
}
Warum bekomme ich: error: 'class QString' has no member named 'first' nor 'second'
Ist e
nicht der Typ QPair
?
InformationsquelleAutor der Frage user336635 | 2011-12-15
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie möchten, dass die STL-Stil mit
first
undsecond
:Wenn Sie möchten, zu verwenden, was Qt bietet, dies zu tun:
InformationsquelleAutor der Antwort Arlen
C++11-Reihe-basierend-für Nutzungen, die Art der dereferenziert den iterator als die automatisch abgeleitet "cursor" geben. Hier ist es der Typ des Ausdrucks
*map.begin()
.Und da
QMap::iterator::operator*()
liefert eine Referenz auf den Wert (vom TypQString &
), der Schlüssel ist nicht zugänglich mit dieser Methode.Sollten Sie verwenden Sie eine der iterator-Methoden in der Dokumentation beschrieben, aber man sollte vermeiden, mit
keys()
denn es geht um die Erstellung einer Liste von keys und dann Suche den Wert für jeden Schlüssel, oder,toStdMap()
weil es kopiert alle map-Elemente mit einem anderenund das wäre nicht sehr optimal.
Sie können auch einen wrapper um
QMap::iterator
alsauto
Typ:Es ist ein weiterer wrapper hier.
InformationsquelleAutor der Antwort alexisdm
Für Menschen mit Interesse an Optimierungen, ich habe versucht, mehrere Ansätze, haben einige micro-benchmarks, und ich kann feststellen, daß STL-Stil Ansatz ist deutlich schneller.
Ich habe versucht, hinzufügen von Ganzzahlen, die mit diesen Methoden :
Und ich habe den Vergleich mit Summen-Ganzzahlen einer QList/QVector
Ergebnisse :
Code für Interessierte :
Bearbeiten. Juli 2017 : ich lief diesen code wieder auf meinem neuen laptop (Qt 5.9, i7-7560U) und bekam einige interessante änderungen
STL-Stil und Java-Stil sehr ähnliche Leistungen in diesem benchmark
InformationsquelleAutor der Antwort Fezvez
In der "alten" C++ mit Qt, Sie würde es so machen:
Ich habe kein C++11 compiler hier aber vielleicht auch die folgenden arbeiten:
Können Sie auch verwenden, Iteratoren statt, check-out hmuelners link, wenn Sie es vorziehen mit Ihnen
InformationsquelleAutor der Antwort Tim Meyer
QMap::iterator verwendet-Taste() und value() - die können leicht gefunden werden in der Dokumentation für Qt 4.8 oder die Dokumentation zur Qt-5.
Edit:
Einen range-basierten for-Schleife generiert codes, die ähnlich wie diese (siehe CPP-Referenz):
QMap::iterator::iterator*() ist äquivalent zu QMap::iterator::value(), und nicht ein paar.
Der beste Weg, dies zu schreiben, ist ohne range-basierte for-Schleife:
InformationsquelleAutor der Antwort hmuelner
Benutzte ich so etwas wie dieses, um meinen eigenen Ergebnis. Nur für den Fall, jemand müsste den Schlüssel und Werte getrennt.
InformationsquelleAutor der Antwort Thierry Joel
Eine andere bequeme Methode, von der QMap Docs. Es ermöglicht den expliziten Zugriff auf Schlüssel und Wert (Java-Stil iterator):
In Fall, dass Sie in der Lage sein zu überschreiben, verwenden Sie
QMutableMapIterator
statt.Gibt es eine andere günstige
Qt
Methode, wenn man nur daran interessiert, das Lesen der Werte, ohne die Schlüssel (mitQt
sforeach
- und c++11):InformationsquelleAutor der Antwort DomTomCat