我正在尝试使用std::map
模板,但我无法使其正常运行。从互联网上的研究我得到了这个解决方案并将文件重定向到输入流,这里是代码:
typedef map<char*, int> wc;
int main() {
int c;
char cc[75], nombre[75];
wc m;
scanf("%d", &c);
while (c--) {
scanf("%s %[ a-zA-Z]", cc, nombre);
++m[cc]; // This should work
printmap(m);
}
}
打印地图是一种只打印地图对象的功能。这是我的文件input.txt
3
Spain Donna Elvira
England Jane Doe
Spain Donna Anna
执行程序时,输出为:
Spain -> 1
England -> 2
Spain -> 1
我的期望是:
Spain -> 2
England -> 1
映射到其出现次数的国家/地区的出现次数
答案 0 :(得分:6)
作为上述评论的解决方案,您提供的代码的C ++版本:
typedef map<std::string, int> wc;
int main() {
int c;
string cc, nombre;
wc m;
std::cin >> c;
while (c--) {
std::cin >> cc;
std::getline(std::cin, nombre);
m[cc] += 1; // This should work
}
printmap(m);
}
首先:std::map
根据代码char*
中的密钥对其数据进行排序,该密钥指向char cc[75]
。因此,当您替换cc
中的文本时,地图的键会发生变化,这会破坏所有内容。地图的键不能永远改变。由于我们使用的是C ++,因此您根本不应使用char[]
;使用std::string
代替,因为它是一个“值类型”,它将使一切都神奇地起作用。我之前不知道它是如何工作的,因为你没有显示printmap
函数。
第二:你每次阅读一行时都会调用printmap
,因为map
无法打印“最后添加的内容”,这个想法完全没有意义。 printmap
调用可能应该打印整个地图,并且在循环之外。
第三:不要使用scanf
,这不安全。使用流:std::cin >> cc
用于单个单词读取,或std::getline(std::cin, nombre)
用于读取行中剩余的内容。这样,如果有人进入该行,代码就不会崩溃(longest country name和longest last name的来源)
Krungthepmahanakornamornratanakosinmahintarayuttha-yamahadilokphopnopparatrajathaniburiromudomrajaniw-esmahasatharnamornphimarnavatarnsathitsakkattiyavi-sanukamprasit Wolfeschlegelsteinhausenbergerdorffvortschaferswesenchafewarenwholgepflegeunzenvonangereifenduchihrraubgiriigfeindtausendjahresvorandieerscheinenbanderechiffgebrauchlichtalsseinursprungvonkrrthinzwischensternartigraumaufdersuchebtbewohnbarplanetenkreisedrehensichundstandigmenshlichkeittkonntevortpflanzeslamdlichfreudeundruhemitnichteinfurchrintlligentgeschopfsvonhinzwischenster