我正在尝试使用该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);
}
}
Run Code Online (Sandbox Code Playgroud)
打印贴图是仅打印地图对象的功能.这是我的文件input.txt
3
Spain Donna Elvira
England Jane Doe
Spain Donna Anna
Run Code Online (Sandbox Code Playgroud)
当我执行程序时,输出是:
Spain -> 1
England -> 2
Spain -> 1
Run Code Online (Sandbox Code Playgroud)
我的期望是:
Spain -> 2
England -> 1
Run Code Online (Sandbox Code Playgroud)
国家/地区的出现次数映射到它出现的次数
作为上述评论的解决方案,您提供的代码的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);
}
Run Code Online (Sandbox Code Playgroud)
第一:std::map排序基于密钥它的数据,在你的代码,char*,这在点char cc[75].因此,当您替换文本时cc,地图的键会发生变化,这会破坏所有内容.地图的键不能永远改变.由于我们使用的是C++,所以根本不应该使用char[]; std::string相反,使用它(因为它是一个"值类型")将使一切都神奇地起作用.我不知道它之前是如何工作的,因为你没有显示这个printmap功能.
第二:你printmap每次读一行都会打电话,而且由于map无法打印"添加的最后一件事",这个想法完全没有意义.该printmap呼叫可能应该打印整个地图,并在循环外.
第三:不要使用scanf,这不安全.使用流:std::cin >> cc用于读取单个单词,或std::getline(std::cin, nombre)用于读取行中剩余的内容.这样,如果有人进入该行,代码将不会崩溃(最长国家名称和最长姓氏的来源)
Krungthepmahanakornamornratanakosinmahintarayuttha-yamahadilokphopnopparatrajathaniburiromudomrajaniw-esmahasatharnamornphimarnavatarnsathitsakkattiyavi-sanukamprasit Wolfeschlegelsteinhausenbergerdorffvortschaferswesenchafewarenwholgepflegeunzenvonangereifenduchihrraubgiriigfeindtausendjahresvorandieerscheinenbanderechiffgebrauchlichtalsseinursprungvonkrrthinzwischensternartigraumaufdersuchebtbewohnbarplanetenkreisedrehensichundstandigmenshlichkeittkonntevortpflanzeslamdlichfreudeundruhemitnichteinfurchrintlligentgeschopfsvonhinzwischenster
Run Code Online (Sandbox Code Playgroud)