2016-06-23 8 views
0

ネストされたQMapのうち、値の取得私は私は、ネストされたQMapに<code>QMap <QString, QMap<QString, QVariant> > map</code></p> <p>と一時QMap <code>QMap <QString, QVariant> tmpMap</code></p> <p>を持って

ループできるようにし、内側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

'for'行にビークポイントを設定し、デバッガ下のコードをステップして値と内容を見ることを提案します参加者。 – mvidelgauz

答えて

1

を試してみてください。 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(); 
} 
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 
    } 
} 

あなたが得るために正確な文字列を知っている必要がありますし、いくつかのQMapを持っている場合などQMap、QHash、のようなものには通常のインデックスはありません私の知る限り特定のQStringによる「何か」。 "Hello、world"がSomething smthに行く場合、map.value( "Hello、world")を書くと、この 'smth'オブジェクトが得られます。すべてのQMapエントリをチェックするには、上記のイテレータを使用します。

あなたはその数によって何かを得るために必要がある場合、私はスタンダール配列、リスト、セット、キュー、スタックを使用することをお勧めいたしますだろうが、など

P.S. kmx78の方法もあなたのために働くはずです。

+0

その行では、インデックスにあるマップの値をtmpMapに代入しようとしていますが、そのように書く方法を正確には分かりません。私はこれがtmpMapが内部のQmap値を格納していない場所であると確信しています。 – TheIntern

+0

ループの外部にループ誘導変数を宣言するのは、実際にはC++スタイルが貧弱です。さらに、C++ 11は今のところ半世紀にわたって私たちと一緒になっていますので、できる限り範囲を使用してください。 –

1

platonshubinが言ったように、最初のループ内のキーは非常に明確ではないが、代わりに:

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

QString(index)あなたはそれがないと思う何をしません

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

単なる「かなり」不明瞭ではない、間違っている! –

関連する問題