遍历地图和打印内容时获得向后输出

Posted

技术标签:

【中文标题】遍历地图和打印内容时获得向后输出【英文标题】:Getting backwards output when iterating through a map and printing content 【发布时间】:2017-04-16 05:45:14 【问题描述】:

当我阅读下面发布的代码时,打印的输出似乎是:

Syndy
    James
    Phuong 
Germaine
    Agatha
    Anges
    Jack

但是,当我运行它时,我首先打印了 Germaine 和他的朋友矢量,然后是 Syndy 和她的朋友矢量:

Germaine
    Agatha
    Anges
    Jack
 Syndy
    James
    Phuong 

谁能帮我理解为什么第二个键 Germaine 在 printFacebook 函数而不是 Syndy 中首先被访问和打印?

#include <iostream>
#include <vector>
#include <string>
#include <map>
using namespace std;

void printFacebook(map<string, vector<string>>& m) 

    for (pair<string, vector<string>> p : m) 
        cout << p.first << endl;
        for (string f : p.second) 
            cout << "\t" << f << endl;
        
    


int main() 

    map<string, vector<string>> facebook;

    facebook["Syndy"].push_back("James");

    facebook.find("Syndy")->second.push_back("Phuong");
    //map<string, vector<string>>::iterator f = facebook.find("Syndy");
    //auto f = facebook.find("Syndy");

    facebook["Germaine"];
    facebook.find("Germaine")->second.push_back("Agatha");
    facebook.find("Germaine")->second.push_back("Anges");
    facebook.find("Germaine")->second.push_back("Jack");

    printFacebook(facebook);

【问题讨论】:

【参考方案1】:

std::map 存储按键值排序的项目。在您的情况下,密钥是 "Syndy""Germaine"。它们的默认顺序是 "Germaine" 排在第一位,"Syndy" 排在第二位。

因此,当您遍历映射的项目时,与键 "Germaine" 对应的项目将在与键 "Syndy" 对应的项目之前看到。

这解释了输出。

【讨论】:

那么 std::map 会自行排序吗?它如何确定键的顺序? @StacksAndParsing,是的。 std::map 有一个用于比较键的可选参数。默认值为std::less&lt;Key&gt;。有关详细信息,请参阅en.cppreference.com/w/cpp/container/map。

以上是关于遍历地图和打印内容时获得向后输出的主要内容,如果未能解决你的问题,请参考以下文章

第五章 图的遍历(深度遍历,广度遍历,城市地图,最少转机)

建立一棵二叉树,并对其进行遍历(先序、中序、后序),打印输出遍历结果

c#在遍历列表时删除元素-向后迭代或使用i--或使用linq同时迭代和删除?

树内容的格式化输出 - 前序遍历

在 Groovy 中循环遍历地图?

二叉树遍历和延伸