如何打印嵌套的map-map-vector

时间:2016-11-17 13:57:31

标签: c++ dictionary iterator

我在加载和打印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;
}

2 个答案:

答案 0 :(得分:1)

使用auto自动推导迭代器的类型,如for(auto itr1 = container.begin(); ...

然后,在第二个循环之前,添加const auto& inner_test = itr1->second;并像您一样迭代嵌套地图。

同样,在第三次循环之前,添加const auto& myVector = itr2->second;

这里发生了什么。

在C ++中,可以重载*->运算符。迭代器就是这样做的。

当您遍历std::map时,迭代器会指向对键和值的引用std::pair。对具有firstsecond字段,在这种情况下,分别是对键和值的引用。

此外,如果您不想更改地图中的数据,请使用.cbegin().cend() - const迭代器。

答案 1 :(得分: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;
    }