2016-06-23 6 views
0

나는 중첩 QMap QMap <QString, QMap<QString, QVariant> > map얻기 가치

QMap <QString, QVariant> tmpMap

내가 내부 QMap의 키와 값 그래서 할 수

루프와 임시 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

원본 '지도'는 어떻게 채워 집니까? 'for' 루프의 시작 부분에서 내용을 검사하려고 했습니까? – mvidelgauz

+0

원래 맵은 다른 함수로 채워져 있고, 그것을 사용하고있는 함수에 전달할 때 모든 것을 포함하고 있습니다. – TheIntern

+0

'for' 라인에 비크 점을 설정하고, 디버거에서 코드를 단계별로 실행하고 값과 내용을 살펴볼 것을 제안합니다. 참가자들. – mvidelgauz

답변

1

을 시도 : platonshubin처럼

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, 같은 것들에는 보통 인덱스가없는 AFAIK 특정 QString에 따라 'Something'. "Hello, world"가 Something smth으로가는 경우 map.value ("Hello, world")를 쓰면이 'smth'객체를 얻을 수 있습니다. 모든 QMap 항목을 확인하려면 위에서 언급 한 반복자를 사용하십시오.

당신이 그 번호로 무언가를 얻을 필요가 있다면 나는 등

P.S.의 standart 배열,리스트, 세트, ​​큐, 스택을 사용하도록 권하고 싶습니다 kmx78의 길은 또한 당신을 위해 일해야합니다.

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

당신이 그것을하지 생각하지 않습니다 QString(index)

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

그 라인에서 나는 tmpMap에 인덱스에있는 맵의 값을 할당하려고 시도하고 있지만, 그렇게하기 위해 쓰는 방법을 정확히 모르겠습니다. 나는 이것이 tmpMap이 내부 Qmap 값을 저장하지 않는 곳이라고 확신한다. – TheIntern

+0

루프 밖에서 루프 유도 변수를 선언하는 것은 정말 좋지 않은 C++ 스타일입니다. 게다가 C++ 11은 현재 우리와 50 년 동안 함께 해왔으므로 가능하면 범위를 사용해야합니다. –

1

첫 번째 루프에서 키 대신, 매우 명확하지 않습니다 말했다. QString::number(index)을 생각할 수도 있지만 반복하더라도 제한된 범위의 숫자가 아닌 키가 있으면 작동하지 않습니다. 실제로는 mapKeys.at(index)을 사용해야합니다. 코드가 작동하게됩니다. 그러나지도의 키를 mapKeys으로 복사해서는 안됩니다. 조기에 비관적입니다.

감사하게도 C++ 11 '은이 모든 것을 쉽고 간결하게 만듭니다. range-for를 사용하여 map의 값 - 내부 맵 -을 반복 할 수 있습니다. 추론 형 const 반복기를 사용하여 누적 된 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

단순한 "꽤"불명확하지 않습니다. 잘못되었습니다! –