2016-11-17 65 views
0

我在加載和打印我的地圖 - 地圖 - 矢量數據結構時遇到問題。我認爲它在打印方面,因爲我不是100%確定如何使用迭代器。如何打印嵌套的地圖 - 地圖 - 矢量

我創建並加載數據到結構來存儲我的數據在這裏: (我創建了inner_test和myvector,因爲它看起來像我需要他們的迭代器我不確定迭代器如何知道inner_test和myvector是測試的一部分)

map<int, map<string, vector<string>>> test; 
map<string, vector<string>> inner_test; 
vector<string> myvector; 

ifstream thisfile; 
const char *file1 = argv[1]; 
thisfile.open(file1); 
string filler; 

while(thisfile >> filler){ 
    string sortedFiller = filler; 
    sort(sortedFiller.begin(), sortedFiller.end()); 
    test[filler.length()][sortedFiller].push_back(filler); 
} 
thisfile.close(); 

我試圖打印它,但我不認爲我很明白我在這裏做什麼。

map<int, map<string, vector<string>>>::iterator itr1; 
map<string, vector<string>>::iterator itr2; 
vector<string>::iterator itr3; 

for(itr1 = test.begin(); itr1 != test.end(); itr1++){ 
    cout << itr1->first; 
    for(itr2 = inner_test.begin(); itr2 != inner_test.end(); itr2++){ 
     cout << itr2->first; 
     for(itr3 = myVector.begin(); itr3 != myVector.end(); itr3++){ 
      cout << *itr3; 
     } 
    } 
    cout << endl; 
} 
+0

您可以使用'multimap ,string>'來簡化很多。 –

+0

@JohnZwinck我不知道multimap。如果鑰匙是一對,我必須提供一對嗎?或者我可以返回與輸入鍵'3'相對應的所有數據嗎? – user1362058

+0

好問題。你需要使用一對搜索。然而,你可以調用'mm.lower_bound(make_pair(3,string()))'獲得第一個值爲3,'mm.lower_bound(make_pair(4,string()))'得到最後一個值。就我所知,這基本上就是你需要的。 –

回答

1

您的inner_testmy_vector變量是空容器,並且與實際的std::map無關,您希望以任何方式打印。這是您如何打印多維容器的示例之一:

// auto type automatically defines itself as a return type of test.begin() 
for(auto itr1 = test.begin(); itr1 != test.end(); itr1++) 
    { 
    cout << itr1->first << ' '; // Add space to separate entries on the same line 
    // itr1->second represents map<string, vector<string>> stored in test. 
    for(auto itr2 = itr1->second.begin(); itr2 != itr1->second.end(); itr2++) 
     { 
     cout << itr2->first << ' '; 
     // itr2->second represents vector<string> stored in map<string, vector<string>> which is stored in test. 
     for(auto itr3 = itr2->second.begin(); itr3 != itr2->second.end(); itr3++) 
      { 
      cout << *itr3 << ' '; 
      } 
     } 
    cout << endl; 
    } 
+0

謝謝完美。那麼inner_test和myvector變量只能被創建,以便迭代器具有用於構建迭代器的相同結構類型的shell? – user1362058

+0

@ user1362058不,你根本不需要這些變量,就像我在聲明_Your'inner_test'和'my_vector'變量的回答中所陳述的那樣,'my_vector'變量是空容器,並且**與實際的' std :: map'_ –

+0

好的。我完全誤解了你的意思。 – user1362058

1

使用auto推斷迭代器的類型自動像for(auto itr1 = container.begin(); ...

然後,在第二個循環之前,添加const auto& inner_test = itr1->second;並像您一樣迭代您的嵌套地圖。

同樣,在第三個循環之前,添加const auto& myVector = itr2->second;

這裏發生了什麼事情。

在C++中,有可能過載*->運算符。迭代器這樣做。

當您遍歷std::map時,迭代器指向std::pair引用鍵和值。 Pair有firstsecond字段,在這種情況下分別是對鍵和值的引用。

此外,使用.cbegin().cend() - 常量迭代器 - 如果您不想更改映射中的數據。