打印地图<string,map <int,int =“”>&gt; cout </string,>

时间:2014-04-06 02:35:50

标签: c++ string map iterator output

有人可以帮忙解决如何打印嵌套地图的内容吗?我计算一个单词出现在文件中的次数,按行号和每行的次数进行报告。每行的单词,行和出现次数存储在以下内容中:

map<string, map<int,int>> tokens;

但是,我不确定语法。我正在打印使用以下代码列出所有单词的外部地图,但无法弄清楚如何打印内部值(行数和每行上出现的次数)。我假设我可以在for循环中将其包含在内联中,但无法弄清楚如何:

for (map <string, map<int, int>>::iterator it = tokens.begin(); it != tokens.end(); ++it){
    cout << it->first << " : " << /* assume I can include another statement here to print the values? */ endl;
}

尝试获得类似于此的输出:

(单词:line:occurrence,出处:出现,......)

about : 16:1, 29:1, 166:1, 190:1, 191:1
above : 137:1
accompanied : 6:1
across : 26:1
admit : 20:1
advancing : 170:1
.
.
.

2 个答案:

答案 0 :(得分:3)

实际上很简单。

您只需使用它获取内部地图 - >第二,然后以相同的方式迭代。

因此,你会写这样的东西:

for (map <string, map<int, int>>::iterator it = tokens.begin(); it != tokens.end(); ++it){
    cout << it->first << " : ";
    map<int, int> &internal_map = it->second;
    for (map<int, int>::iterator it2 = internal_map.begin(); it2 != internal_map.end(); ++it2){
        if (it2 != internal_map.begin())
            cout << ",";
        cout << it2->first << ":" << it2->second;
    }
    cout << endl;
}

如果你有C ++ 11支持,你可以写这样的东西:

for (auto it : tokens) {
    cout << it->first << " : ";
    map<int, int> &internal_map = it->second;
    for (auto it2: internal_map) {
        if (it2 != internal_map.begin())
            cout << ",";
        cout << it2->first << ":" << it2->second;
    }
    cout << endl;
}

答案 1 :(得分:1)

C ++ 17

C++17起,您可以将range-based for loopsstructured bindings一起用于遍历地图。 这样,lpapp's C++11 solution的可读性可以进一步提高,如下所示:

for (auto const &[k1, v1] : tokens) {
    std::cout << k1 << " : ";
    for (auto const &[k2, v2] : v1) {
        if (&k2 != &v1.begin()->first)
            std::cout << ", ";
        std::cout << k2 << ":" << v2;
    }
    std::cout << std::endl;
}

注意:我承认,打印逗号的支票有点乱。如果您正在寻找更好的解决方案, 可能想看看this Q&A

Code on Coliru