2016-11-17 70 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() - 常量迭代器 - 如果您不想更改映射中的数据。