我写了一个程序,其中某些条目被制作成 map 。后来用迭代器想看这种格式的键值对
key=value.
但是输出是
=key value.
这是代码
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
会附加在您输入的末尾。所以你的输入实际上是这样的:
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
(key)和相应的number
(value)(此方法适用于包含空格的字符串在名称中)像这样:2 abhay nayar 239487 hello 23478
或者,您可以使用
cin >> name >> number
来获取这些值(但您不能使用包含空格的名称,因为任何空白字符都是cin 的分隔符
).
关于c++ - 在 C++ 中使用 map 时输出顺序错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38967597/