在c++中使用map时输出顺序错误
Wrong order of output while using map in C++
我编写了一个程序,其中某些条目被制作成一个地图。稍后,使用迭代器,我希望看到以下格式的键值对
键=值。
但是输出是
=键值。
下面是代码
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
变量中不存储 (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
的分隔符)。
相关文章:
- 如何在 C++ 中将从文本文件中读取的元素推送和弹出到数组中,并按 Revserse 顺序输出堆栈?
- 堆排序,我无法弄清楚我的代码出了什么问题,输出顺序不正确
- C++ 以相反的顺序输出文本文件
- 函数以相反的顺序输出输入问题,并改进算法以解释相等的数字
- `sTD :: sample()的输出序列是否遵循输入序列的顺序
- cout 和 cerr 的控制台输出顺序错误
- C 的输出顺序错误
- 以特定顺序输出地图
- 以正确的顺序输出队列
- 输出未按正确的顺序打印
- 更改声明顺序时输出不正确
- VC++编译器输出顺序
- 为什么 bool 显示正确的位顺序,而直接输出移位运算结果却不显示?
- C++输出顺序
- 数字的基本表示-输出顺序相反
- fprintf和WriteConsole的输出顺序相反
- o流链接,输出顺序
- 在c++中使用map时输出顺序错误
- 检查输出顺序是否正确
- 如何在C++中反转输出顺序?(有或没有递归)