2014-12-02 7 views
0

У меня есть структурировать QMap<QString, QMap<QString, QString> > *map;Как получить второе значение в QMap <QString, QMap <QString, QString>>

Далее я ввожу данные:

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(); 

ответ

2

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

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

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

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

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

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

В качестве альтернативы вы можете перебирать внутреннюю карту в «STL-way» с проверками .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(); 
}