我在加载和打印map-map-vector数据结构时遇到问题。我认为它在打印方面,因为我不是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 :(得分:1)
使用auto
自动推导迭代器的类型,如for(auto itr1 = container.begin(); ...
。
然后,在第二个循环之前,添加const auto& inner_test = itr1->second;
并像您一样迭代嵌套地图。
同样,在第三次循环之前,添加const auto& myVector = itr2->second;
。
这里发生了什么。
在C ++中,可以重载*
和->
运算符。迭代器就是这样做的。
当您遍历std::map
时,迭代器会指向对键和值的引用std::pair
。对具有first
和second
字段,在这种情况下,分别是对键和值的引用。
此外,如果您不想更改地图中的数据,请使用.cbegin()
和.cend()
- const迭代器。
答案 1 :(得分:1)
您的inner_test
和my_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;
}