Получение значения из вложенной QMap

У меня есть вложенная QMap QMap <QString, QMap<QString, QVariant> > map

и временная 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
    }
}

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


person TheIntern    schedule 23.06.2016    source источник
comment
Как заполняется оригинал map? Вы пытались проверить его содержимое в начале цикла for?   -  person mvidelgauz    schedule 23.06.2016
comment
Исходная карта заполнена другой функцией и содержит все, когда я передаю ее в функцию, в которой я ее использую.   -  person TheIntern    schedule 23.06.2016
comment
Я бы по-прежнему предлагал установить точку клюва на for строке, перешагивать код в отладчике и смотреть значения и содержимое участников.   -  person mvidelgauz    schedule 23.06.2016


Ответы (3)


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

К счастью, C ++ 11 'делает все это простым и кратким. Вы можете использовать range-for для перебора значений - внутренних карт - map. И вы можете использовать константный итератор выведенного типа, чтобы затем перебирать пары ключ / значение накопленной карты 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();
}
person Kuba hasn't forgotten Monica    schedule 23.06.2016

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

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

пытаться

tmpMap.unite(map.value(mapKeys.at(index)));
person kmx78    schedule 23.06.2016

Что вы имеете в виду, написав 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, используйте итераторы, о которых я упоминал выше.

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

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

person platonshubin    schedule 23.06.2016
comment
В этой строке я пытаюсь присвоить tmpMap значение в карте, расположенной по индексу, но я точно не знаю, как это сделать. Я уверен, что именно здесь tmpMap не хранит внутренние значения Qmap. - person TheIntern; 23.06.2016
comment
Действительно плохой стиль C ++ - объявлять переменные индукции цикла вне цикла. Более того, C ++ 11 существует уже полдесятилетия, поэтому вы должны использовать range-for там, где это возможно. - person Kuba hasn't forgotten Monica; 24.06.2016