2012-09-26 87 views
0

我在迭代地圖中的第二張地圖時遇到問題。遍歷地圖內的地圖

#include <map> 

using namespace std; 

map<string, map<string, string> > mymap; 
map<string, map<string, string> >::iterator itm; 
pair<map<string, map<string, string> >::iterator,bool> retm; 

for(itm=mymap.begin(); itm!=mymap.end(); ++itm) 
{ 
cout << "first:\t" << it->first << endl; 
} 

如何迭代第二張圖並獲得第一個和第二個鍵/值?

第二個問題是,如何使用地圖附帶的「插入」功能「插入」第一張和第二張地圖?

我希望有人有一個完整的答案。

回答

3
#include <map> 
#include <iostream> 
using namespace std; 

map<string, map<string, string> > mymap; 
map<string, map<string, string> >::iterator itm; 
pair<map<string, map<string, string> >::iterator,bool> retm; 

int main() { 

    /* populate: */ 
    mymap.insert(make_pair ("something", map<string, string>())); 
    mymap["something"].insert(make_pair ("2", "two")); 

    /* traverse: */ 
    for(itm=mymap.begin(); itm!=mymap.end(); ++itm) 
    { 
    cout << "first:\t" << itm->first << endl; 

    for (map<string, string>::iterator inner_it = (*itm).second.begin(); 
     inner_it != (*itm).second.end(); 
     inner_it++) { 
     cout << (*inner_it).first << " => " << (*inner_it).second << endl; 
    } 

    } 

    return 0; 
} 
+0

爲了公平起見,問題中的代碼也沒有。 – Martin

+1

@Martin:好的,但是大多數SO問題都是如此。這通常是爲什麼他們是問題... –

+0

這個問題顯然是要求兩件事情:你通常如何訪問內部地圖;以及如何插入新元素。他們沒有問及它/它的錯字。 – Martin

4

it->second會給你「第二張地圖」。只需重複一遍即可。

2

您將需要第二個迭代器在另一個嵌套的for-loop循環遍歷it-> second,就像您在mymap上迭代一樣。

2

像這樣:

typedef std::map<std::string, std::map<std::string, std::string>>::iterator outer_it; 
typedef std::map<std::string, std::string>::iterator      inner_it; 

for (outer_it it1 = mymap.begin(); it1 != mymap.end(); ++it1) 
{ 
    for (inner_it it2 = it1->second.begin(); it2 != it1->second.end(); ++it2) 
    { 
     std::cout << "first: " << it1->first << ", second: " << it2->first 
        << ", value: " << it2->second << std::endl; 
    } 
} 

要插入:

mymap["hello"]["world"] = "foo"; 

或者,使用insert

mymap["hello"].insert(std::make_pair("world", "foo")); 

如果要插入多個值,只執行一次外部查詢:

std::map<std::string, std::string> & m = mymap["hello"]; 
m.insert(std::make_pair("world", "foo")); 
m.insert(std::make_pair("word", "boo")); 
m.insert(std::make_pair("lord", "coo")); 
+0

不能編譯 – perreal

+0

是的,但我的意思是使用map :: insert函數。但我非常喜歡你對第一部分所做的一切。謝謝。 :) – user1058431

+0

@perreal:謝謝,修正 - 我在OP的代碼中誤讀了一個'typedef',實際上沒有! –

1

在C++ 11,你可以做這樣的:

for (const auto& outerElem: mymap) { 
    cout << "First: " << outerElem.first << endl; 
    for (const auto& innerElem: outerElem.second) { 
     cout << " First: " << innerElem.first << endl; 
     cout << " Second: " << innerElem.second << endl; 
    } 
} 

在C++ 03,你也可以用BOOST_FOREACH做到這一點。儘管如此,你不能使用auto,所以最好是像這樣鍵入每種類型。無論如何,使用這樣的typedefs是個好主意。

typedef map<string, string> innerMap; 
typedef map<string, innerMap> outerMap;