String Indizierter QVector, QList o.ä.
-
Hallo Zusammen,
ich versuche mich gerade in C++ und QT unter Linux einzuarbeiten. Nun hab ich mal eine Frage wie ich ein String-Indizierten QVector oder ähnliches benutzen kann.
Also ich würde gerne einfach folgendes machen:
meinArray['Wert1']['Value1'] = "erster Value von Wert1"; meinArray['Wert1']['Value2'] = "zweiter Value von Wert1"; meinArray['Wert2']['Value1'] = "erster Value von Wert2"; meinArray['Wert2']['Value2'] = "zweiter Value von Wert2";
Und am besten natürlich mit einer Foreach schleife darauf zugreifen können. Wie kann ich das machen? Vectoren scheinen nur Int basierte Indexe zu erlauben, oder irre ich mich?
Vielen Dank
Gruß
-
Es gibt keinen "String-basierten Vector". Aber es gibt QMap und QHash. Da kannste dir den Key-type und den Value-type aussuchen. Für den Key muss natürlich ein operator== existieren, sonst macht das wenig Sinn
// edit:
BTW stehen Strings immer in doppelten Anführungszeichen. Dein Zugriff würde also nicht wirklich klappen. Dazu aber mehr in deinem C++-Grundlagenbuch (welches du hoffentlich besitzt, denn ohne ordentlichem C++ kein Qt)
-
l'abra d'or schrieb:
Es gibt keinen "String-basierten Vector". Aber es gibt QMap und QHash. Da kannste dir den Key-type und den Value-type aussuchen. Für den Key muss natürlich ein operator== existieren, sonst macht das wenig Sinn
falsch. QMap verlangt
operator<
.operator==
wird von QHash vorausgesetzt@TE:
QMap<QString, QMap<QString, QString> > meinArray;
http://doc.trolltech.com/4.6/qhash.html
http://doc.trolltech.com/4.6/qmap.html
-
zwutz schrieb:
falsch. QMap verlangt
operator<
.operator==
wird von QHash vorausgesetztStimmt, mist.
Und ich hatte die Doku offen und den Satz genau vor meiner Nase
-
Ja sorry, Hochkomma und semikolon. Bin halt noch bei PHP manchmal
Hab nicht wirklich drüber nachgedacht.
Danke ich probiere es mal mit ner qmap.
-
Ok, das eine klappt schonmal!
So hab nun dieses kleine Script geschrieben:QMap<QString, QMap<QString, QString> > test2darray; test2darray["Wert1"]["Value1"] = QString::fromStdString("test1"); test2darray["Wert1"]["Value2"] = QString::fromStdString("test2"); test2darray["Wert1"]["Value3"] = QString::fromStdString("test3"); test2darray["Wert2"]["Value1"] = QString::fromStdString("bla1"); test2darray["Wert2"]["Value2"] = QString::fromStdString("bla2"); test2darray["Wert2"]["Value3"] = QString::fromStdString("bla3");
Wenn ich nun diese Foreach-Schleife durchlaufen lasse geht es, mir werden die Werte test1-3 angezeigt:
foreach(QString str, test2darray["Wert1"]) { qDebug() << str; }
Aber wenn ich nun die Foreach-Schleife für's erste Paar ausgeben möchte klappt das leider noch nicht:
foreach(QString str, test2darray) { qDebug() << str; }
Da hätte ich jetzt gerne die Werte "Wert1" und "Wert2" ausgegeben. Dat klappt aber irgendwie nicht mit dem was ich da gemacht habe
Könnt Ihr mir da nochmal helfen?
Als nächstes wäre noch die Frage wie ich bei der oberen Schleife noch den Key von dem aktuellen Wert bekommen kann. Also irgendwie sowas:
foreach(QString str, test2darray["Wert1"]) { qDebug() << "Key: " << key << " mit dem Wert: " << str; }
und als Ausgabe hätte ich dann:
Key: Value1 mit dem Wert: test1
Key: Value2 mit dem Wert: test2
Key: Value3 mit dem Wert: test3Vielen dank euch allen!!
-
foreach ist da eher die schlechtere Wahl. Wenn du Zugriff auf die keys haben willst, musst du die iteratoren bemühen
for (QMap<QString, QMap<QString, QString> >::iterator oiter = test2darray.begin(); oiter != test2darray.end(); ++oiter) { QString key1 = oiter.key(); QMap<QString, QString> value1 = oiter.value(); for (QMap<QString, QString>::iterator iiter = value1.begin(); iiter != value1.end(); ++iiter) { QString key2 = iiter.key(); QString value2 = iiter.value(); std::cout << "test2darray[\"" << key1 << "\"][\"" << key2 << "\"] = \"" << value2 << "\"" << std::endl; } }
-
QMap<QString, QMap<QString, QString> > test2darray; test2darray["Wert1"]["Value1"] = QString::fromStdString("test1"); [...]
Ist das dein Ernst?
Du erstellst da erst einen std::string mit nem const char* als Parameter, nur um ihn dann über QString::fromStdString() in einen QString zu bekommen?
Das sollte eigentlich auch so funktionieren:test2darray["Wert2"]["Value1"] = "bla1"
Ansonsten gibt es auch für QString den Konstruktor mit const char* als Parameter, kein Grund also um den Umweg über std::string zu gehen!
-
QString den Konstruktor mit const char* als Parameter, kein Grund also um den Umweg über std::string zu gehen!
bei mir meckert er immer! Und sagt das es ebend solch einen Konstruktor nicht gibt!
-
Ok, mit iteratoren geht es wunderbar! Vielen vielen Dank
-
der_burner schrieb:
QString den Konstruktor mit const char* als Parameter, kein Grund also um den Umweg über std::string zu gehen!
bei mir meckert er immer! Und sagt das es ebend solch einen Konstruktor nicht gibt!
evtl irgendwo
QT_NO_CAST_FROM_ASCII
definiert?Dann würde ich aber
QString::fromAscii(const char*)
verwenden.
-
Jup, das wars! War in der .pro Datei definiert. Habs rausgeschmissen und schon läufts.
Vielen Dank
-
zwutz schrieb:
Dann würde ich aber
QString::fromAscii(const char*)
verwenden.Ich denke QString::fromLocal8Bit() ist besser. Das verwendet die locale. Latin-1 ist ja nicht unbedingt überall das Nonplusultra...