在 C++ 中使用 map 时输出顺序错误

Posted

技术标签:

【中文标题】在 C++ 中使用 map 时输出顺序错误【英文标题】:Wrong order of output while using map in C++ 【发布时间】:2016-08-16 06:01:27 【问题描述】:

我编写了一个程序,其中某些条目被制成地图。后来,使用迭代器,我想看到这种格式的键值对

键=值。

但是输出是

=键值。

这是代码

int main() 

    map<string,string> mp; 

    int n;
    string name, number;

    cin>>n;

    for(int i=0; i<n; ++i)
    
        getline(cin,name);
        getline(cin,number);
        mp.insert(pair<string,string>(name,number));
    

    string line;
    map<string,string>::iterator fndr;

    fndr = mp.begin();
    cout << (*fndr).first << "=" << (*fndr).second;

    return 0;

这是输入

2
abhay 239487
hello 23478

这是输出

=abhay 239487

【问题讨论】:

您的问题是什么?您是否要求人们为您调试代码?为什么不从检查地图的输入开始呢? 当您在 SO 上发布问题时,如果您使用 debugger 并检查地图中实际放入的内容等,您可能已经解决了问题. @rustyx 但是当你可以让别人免费为你编写代码时,为什么要这样做:-) 【参考方案1】:

您的.first 是空的,整个事情都在.second 中进行。 getline() 正在获取整个字符串输入并将其存储在 number 变量中。快速解决方案(但不适用于包含空格的名称):

cin >> name;
cin >> number;

说明:

在使用getline() 之前,您已经使用cin &gt;&gt; n 输入了字符串的数量。输入后,当您按下Enter 时,输入末尾会附加一个\n。所以你的输入实际上是这样的:

2\n
abhay 239487\n
hello 23478\n

现在cin &gt;&gt; n 在第一行使用2 将其存储在n 变量中,但\n 仍然存在于流中。当getline() 用于下一个输入时,它会在输入流中找到\n 并终止,从而将nothing 存储在name 变量中(\ngetline() 的分隔符) .下一个getline() 在遇到另一个\n 之前找到字符串abhay 239487 并终止。

因此,我们需要在第一次执行getline()之前忽略2之后的\n)。我们可以在最后一个cin 和第一个getline() 之间使用cin.ignore()。这将忽略输入流中的下一个字符。

代码

int main() 
    map<string,string> mp; 
    int n;
    string name, number;

    cin>>n;
    cin.ignore();

    for(int i=0; i<n; ++i) 
        getline(cin,name);
        getline(cin,number);
        mp.insert(pair<string,string>(name,number));
    

    string line;
    map<string,string>::iterator fndr;

    fndr = mp.begin();
    cout << (*fndr).first << "=" << (*fndr).second;

    return 0;

你可以注意到使用cin.ignore()后,abhay 239487进入namehello 23478进入number。输出是:

abhay 239487=hello 23478

这是这种情况下的预期。

如何解决分离键:值对的问题?有两种方式:

您可以在两个不同的行中输入name(键)和对应的number(值)(此方法适用于名称中包含空格的字符串),如下所示:

2
abhay nayar
239487
hello
23478

或者,您可以使用cin &gt;&gt; name &gt;&gt; number 来获取这些值(但您不能使用包含空格的名称,因为任何空白字符都是cin 的分隔符)。

【讨论】:

@taskinoor 然后,OP 将不得不将字符串和数字作为不同行的输入。 是的,请在答案中解释。否则对 OP 不会有太大帮助。 另外你应该解释一下为什么 first 会变空。 这无论如何都行不通。查看输入格式。

以上是关于在 C++ 中使用 map 时输出顺序错误的主要内容,如果未能解决你的问题,请参考以下文章

c++基础——关联容器

在 c++ 中加快 map<string,int> .find() 的最快方法。键按字母顺序排列的位置

如何按输入顺序输出 C++11 unordered_map/unordered_set 和 Java HashMap/HashSet 值?

HashMap的add时的顺序和输出时顺序不一样

在 C++ 中读取顺序文件时出错

迭代 unordered_map C++