2016-06-23 20 views
0

Ich habe eine verschachtelte QMap QMap <QString, QMap<QString, QVariant> > mapGegenwert von Nested QMap

und eine temporäre QMap QMap <QString, QVariant> tmpMap

Ich brauche die vorübergehende QMap mit der inneren QMap der Schlüssel und Werte zu füllen, so kann ich

Schleife durch und geben Sie alle Werte der verschachtelten QMap aus.

Dies ist derzeit mein Code

QMap <QString, QMap<QString, QVariant> > map; 
QMap <QString, QVariant> tmpMap; 
QList<QString> mapKeys = map.keys(); 

for(int index = 0; index < mapKeys.size(); ++index) 
{ 
    tmpMap.unite(map.value(QString(index))); 
    QList<QString> tmpMapKeys = tmpMap.keys() 

    for(int index2 = 0, index2 < tmpMapKeys.size(); ++index2) 
    { 
     //Stuff to check and output 
    } 
} 

die zweite for-Schleife läuft jedoch nie, da die TmpMap nie etwas speichert.

+0

Wie ist die ursprüngliche 'map' gefüllt? Haben Sie versucht, den Inhalt zu Beginn der For-Schleife zu überprüfen? – mvidelgauz

+0

Die ursprüngliche Karte ist in einer anderen Funktion gefüllt und enthält alles, wenn ich es in die Funktion übergeben Ich verwende es in – TheIntern

+0

Ich würde immer noch vorschlagen, Schnabelpunkt auf 'for' Linie zu setzen, über den Code unter Debugger und beobachten Werte und Inhalte von Teilnehmer. – mvidelgauz

Antwort

1

Die QString(index) nicht tut, was Sie denken, es tut. Sie denken vielleicht an QString::number(index), aber selbst dann wird es nicht funktionieren, wenn einer der Schlüssel Werte hat, die keine Zahlen im begrenzten Bereich sind, auf dem Sie iterieren. Sie sollten wirklich mapKeys.at(index) verwendet haben: Es würde Ihren Code zum Funktionieren bringen. Aber Sie sollten die Schlüssel der Karte in mapKeys überhaupt nicht kopieren: es ist vorzeitige Pessimierung.

Zum Glück macht C++ 11 'all das einfach und prägnant. Sie können range-for verwenden, um die Werte - die inneren Karten - von map zu iterieren. Und Sie können einen const-iterator vom abgeleiteten Typ verwenden, um dann die Schlüssel/Wert-Paare der akkumulierten allInners Karte zu iterieren.

#include <QtCore> 

int main() { 
    QMap<QString, QMap<QString, QVariant>> map; 
    QMap<QString, QVariant> allInners; 

    // accumulate the inner keys/values 
    for (auto const & inner : map) 
     allInners.unite(inner); 

    // process the inner keys/values 
    for (auto it = allInners.cbegin(); it != allInners.cend(); ++it) 
     qDebug() << it.key() << it.value(); 
} 
0

Was meinen Sie mit dem Schreiben von map.value (QString (Index))? Das ist zumindest für mich ziemlich zweideutig. Im Beispiel, wenn ich QString (0x40) schreibe, erhalte ich eine Zeichenkette mit einem @ -Zeichen darin (0x40 ist sein Code) und du machst dasselbe, schätze ich, d. H. QString (int) anrufend. Versuchen Sie also, expliziter zu schreiben.

Um einige Container zu durchlaufen, würde ich Ihnen empfehlen, Iteratoren zu verwenden, die sehr nützlich sind. Die Verwendung folgt (Code wird nicht getestet, obwohl):

QMap <QString, QMap<QString, QVariant> > map; 
QMap <QString, QMap<QString, QVariant> >::const_iterator i; 
QMap<QString, QVariant>::const_iterator i2; 

for (i = map.begin(); i != map.end(); i++) 
{ 
    for (i2 = i.value.begin(); i2 != i.value.end(); i2++) 
    { 
     //Access to all the keys and values of nested QMap here 
     //i2.key() is some QString and i2.value() is some QVariant 
     //Stuff to check and output 
    } 
} 

AFAIK gibt es keine üblichen Indizes in Dinge wie QMap, QHash usw. Wenn Sie etwas QMap haben, dann müssen Sie die genaue Zeichenfolge kennen zu lernen 'Etwas' nach bestimmten QString. Wenn "Hello, world" zu Something smth geht, wenn Sie map.value ("Hello, world") schreiben, erhalten Sie dieses "smth" -Objekt. Um alle QMap-Einträge zu überprüfen, verwenden Sie Iteratoren, die ich oben erwähnt habe.

Wenn Sie etwas über seine Nummer bekommen müssen, dann würde ich empfehlen Sie standart Arrays, Listen, Mengen zu verwenden, Warteschlangen, Stapel usw.

P. S. Der Weg von kmx78 sollte auch für Sie funktionieren.

+0

Bei dieser Zeile versuche ich, tmpMap den Wert in der Map am Index zuzuordnen, aber ich weiß nicht genau, wie ich es schreiben soll. Ich bin mir sicher, dass die tmpMap die inneren Qmap-Werte nicht speichert. – TheIntern

+0

Es ist wirklich schlechter C++ - Stil, Schleifeninduktionsvariablen außerhalb der Schleife zu deklarieren. Darüber hinaus ist C++ 11 nun schon seit einem halben Jahrzehnt bei uns, also sollten Sie, wo möglich, die Reichweite nutzen. –

1

Wie platonshubin sagte, der Schlüssel in der ersten Schleife ist nicht ganz klar, statt:

tmpMap.unite(map.value(QString(index))); 

versuchen

tmpMap.unite(map.value(mapKeys.at(index))); 
+0

Es ist nicht einfach "ziemlich" unklar, es ist falsch! –