std :: map表现不如预期

And*_*rés 1 c++ map

我正在尝试使用该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)

国家/地区的出现次数映射到它出现的次数

Dri*_*ise 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);
}
Run Code Online (Sandbox Code Playgroud)

http://ideone.com/2JP82

第一: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)