我正在尝试使用 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);
}
}
打印 map 是一个只打印 map 对象的函数。这是我的文件 input.txt
3
Spain Donna Elvira
England Jane Doe
Spain Donna Anna
当我执行程序时,输出是:
Spain -> 1
England -> 2
Spain -> 1
我期望的是:
Spain -> 2
England -> 1
Country的出现次数映射到它出现的次数
最佳答案
作为我上面评论的解决方案,您提供的代码的 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
中的文本时, map 的键会发生变化,这会破坏一切。 map 的键绝不能改变。由于我们使用的是 C++,因此您根本不应该使用 char[]
;使用 std::string
代替,它(因为它是一个“值类型”)将使一切都神奇地工作。我不知道它之前是如何工作的,因为您没有显示 printmap
函数。
其次:每次阅读一行时都调用 printmap
,并且由于 map
无法打印“最后添加的内容”,这个想法根本没有意义。 printmap
调用应该打印整个 map ,并且在循环之外。
第三:不要使用scanf
,它不安全。使用流:std::cin >> cc
用于读取单个单词,或 std::getline(std::cin, nombre)
用于读取剩余内容线。这样,如果有人输入该行,代码就不会崩溃(longest country name 和 longest last name 的来源)
Krungthepmahanakornamornratanakosinmahintarayuttha-yamahadilokphopnopparatrajathaniburiromudomrajaniw-esmahasatharnamornphimarnavatarnsathitsakkattiyavi-sanukamprasit Wolfeschlegelsteinhausenbergerdorffvortschaferswesenchafewarenwholgepflegeunzenvonangereifenduchihrraubgiriigfeindtausendjahresvorandieerscheinenbanderechiffgebrauchlichtalsseinursprungvonkrrthinzwischensternartigraumaufdersuchebtbewohnbarplanetenkreisedrehensichundstandigmenshlichkeittkonntevortpflanzeslamdlichfreudeundruhemitnichteinfurchrintlligentgeschopfsvonhinzwischenster
关于c++ - std::map 未按预期运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10937605/