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

Wrong order of output while using map in C++

本文关键字:输出 顺序 错误 map c++      更新时间:2023-10-16

我编写了一个程序,其中某些条目被制作成一个地图。稍后,使用迭代器,我希望看到以下格式的键值对

键=值。

但是输出是

=键值。

下面是代码

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

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

cin >> name;
cin >> number;

解释:

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

2n
abhay 239487n
hello 23478n

现在cin >> n在第一行使用2将其存储在n变量中,但n仍然在流中。当getline()用于下一个输入时,它在输入流中找到n并终止,因此在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 239487name中,hello 23478number中。输出为:

abhay 239487=hello 23478

在这种情况下是预期的。

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

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

    2
    abhay nayar
    239487
    hello
    23478
    
  • 或者,您可以使用cin >> name >> number来获取这些值(但是您不能使用包含空格的名称,因为任何空白字符都是cin的分隔符)。