在 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 >> n
输入了字符串的数量。输入后,当您按下Enter
时,输入末尾会附加一个\n
。所以你的输入实际上是这样的:
2\n
abhay 239487\n
hello 23478\n
现在cin >> n
在第一行使用2
将其存储在n
变量中,但\n
仍然存在于流中。当getline()
用于下一个输入时,它会在输入流中找到\n
并终止,从而将nothing 存储在name
变量中(\n
是getline()
的分隔符) .下一个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
进入name
和hello 23478
进入number
。输出是:
abhay 239487=hello 23478
这是这种情况下的预期。
如何解决分离键:值对的问题?有两种方式:
您可以在两个不同的行中输入name
(键)和对应的number
(值)(此方法适用于名称中包含空格的字符串),如下所示:
2
abhay nayar
239487
hello
23478
或者,您可以使用cin >> name >> number
来获取这些值(但您不能使用包含空格的名称,因为任何空白字符都是cin
的分隔符)。
【讨论】:
@taskinoor 然后,OP 将不得不将字符串和数字作为不同行的输入。 是的,请在答案中解释。否则对 OP 不会有太大帮助。 另外你应该解释一下为什么 first 会变空。 这无论如何都行不通。查看输入格式。以上是关于在 C++ 中使用 map 时输出顺序错误的主要内容,如果未能解决你的问题,请参考以下文章
在 c++ 中加快 map<string,int> .find() 的最快方法。键按字母顺序排列的位置
如何按输入顺序输出 C++11 unordered_map/unordered_set 和 Java HashMap/HashSet 值?