2016-06-23 3 views
0

У меня есть вложенную QMap QMap <QString, QMap<QString, QVariant> > mapПолучение значения из вложенного QMap

и временный QMap QMap <QString, QVariant> tmpMap

Мне нужно заполнить временную QMap с ключами и значениями внутренней QMap таким образом я могу

петли через и выводить все значения вложенного QMap.

Это в настоящее время мой код

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 
    } 
} 

Однако второй цикл никогда не заканчивается, так как tmpMap никогда ничего не хранит.

+0

Как оригинальная 'map' заполнена? Вы пытались проверить его содержимое в начале цикла 'for'? – mvidelgauz

+0

Исходная карта заполнена другой функцией и содержит все, когда я передаю ее в функцию, которую я использую в – TheIntern

+0

. Я бы все же предложил установить beakpoint в строке 'for', перешагнуть код под отладчиком и посмотреть значения и содержимое участников. – mvidelgauz

ответ

1

QString(index) не делать то, что вы думаете, что он делает. Возможно, вы думаете о QString::number(index), но даже тогда он не будет работать, если какой-либо из ключей имеет значения, которые не являются номерами в ограниченном диапазоне, в котором вы повторяете. Вы действительно должны были использовать mapKeys.at(index): он заставит ваш код работать. Но вы не должны копировать ключи карты в mapKeys: это преждевременная пессимизация.

К счастью, C++ 11 'делает все это простым и лаконичным. Вы можете использовать range-for для повторения значений - внутренних карт - map. И вы можете использовать const-iterator с выведенным типом, чтобы затем перебрать пары ключ/значение накопленной карты allInners.

#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

Что вы понимаете, написав map.value (QString (index))? Это, по крайней мере, довольно неоднозначно для меня. В примере, если я пишу QString (0x40), я получу в нем строку с символом @ (0x40 - это ее код), и вы делаете то же самое, я думаю, то есть вызывая QString (int). Поэтому попробуйте написать более подробно.

Чтобы проходить через некоторые контейнеры, я бы рекомендовал использовать итераторы, которые очень полезны. Использование является следующим (код не проверял, хотя):

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 нет обычных индексов в таких вещах, как QMap, QHash и т.д. Если у вас есть QMap, то вам необходимо знать точную строку, чтобы получить «Что-то» в соответствии с определенным QString. Если «Hello, world» переходит в Something smth, тогда, если вы напишете map.value («Hello, world»), вы получите этот объект «smth». Чтобы проверить все записи QMap, используйте итераторы, о которых я говорил выше.

Если вам нужно, чтобы получить что-то по его номеру, то я бы рекомендовал вам использовать Standart массивы, списки, наборы, очереди, стеки и т.д.

P.S. путь kmx78 должен также работать на вас.

+0

В этой строке я пытаюсь назначить tmpMap значение на карте, расположенную по индексу, но я точно не знаю, как записать его для этого. Я уверен, что здесь tmpMap не сохраняет внутренние значения Qmap. – TheIntern

+0

Это действительно плохой стиль C++ для объявления переменных индукции цикла вне цикла. Кроме того, C++ 11 работает с нами уже пол-десятилетия, поэтому вы должны использовать диапазон, где это возможно. –

1

Как platonshubin сказал, ключ в первом цикле не совсем понятно, вместо:

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

попробовать

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

Это не просто «совершенно» неясно, это неправильно! –

Смежные вопросы