Как получить второе значение в QMap‹QString, QMap‹QString, QString› ›

У меня есть структура QMap<QString, QMap<QString, QString> > *map;

Далее я вставляю данные:

map = new QMap<QString,QMap<QString, QString> >;
QMap<QString,QString> *d = new QMap<QString, QString>;
d->insert("Name","Michal");
map->insert("QLineEdit",*d);

если я попытаюсь

QMapIterator<QString, QMap<QString, QString> > i(*mapa);
    while (i.hasNext()) {
        i.next();
        qDebug() << "Key: " << i.key() << " Value: " << i.value() << endl;

    }

Я получил:

Key:  "QLineEdit"  Value:  QMap(("Name", "Michal")).

Как получить Name в качестве Ключа и Michal в качестве Значения?

Я пробовал:

QMap<QString, QString> *p = new QMap<QString, QString>;
  *p = i.value();
  qDebug() << "Key: " << p->key() << " Value: " << p->value();

Но это не работает, я получаю следующую ошибку:

no matching function for call to 'QMap<QString, QString>::key()' qDebug()` << "Key: " << p->key() << " Value: " << p->value();

person MiMo    schedule 02.12.2014    source источник


Ответы (1)


В вашей реализации первая карта содержит внутреннюю карту (ваша переменная d).

Представьте, что у вас есть еще один элемент на d-карте, скажем, Age. Тогда вы бы добавили еще один элемент:

d->insert("Age", "42");

Если вы сейчас просто попытаетесь напечатать p->key(), как в вашей попытке, вы не можете знать, к какой из переменных «Возраст» и «Имя» вы получите доступ, поэтому вам нужен второй итератор.

Если вы хотите распечатать все ключи и значения этой внутренней карты, вы можете создать новый итератор, который перебирает вторую карту, получает и печатает значение:

QMapIterator<QString, QString > i2(i.value());
while (i2.hasNext()) {
  i2.next();
  qDebug() << "  Key: " << i2.key() << " Value: " << i2.value() << endl;
}

В качестве альтернативы вы можете перебирать внутреннюю карту в "STL-способе" с проверками .begin() и .end():

QMap<QString, QString>::const_iterator i2;
for (i2 = i.value().begin(); i2 != i.value().end(); ++i2){
  qDebug() << "  Key: " << i2.key() << " Value: " << i2.value();
}
person Enfenion    schedule 02.12.2014