1

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

Country 的出现次数映射到它出现的次数

4

1 回答 1

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);
}

http://ideone.com/2JP82

首先:std::map根据代码中的键对数据进行排序,char*,它指向char cc[75]。因此,当您替换 中的文本时cc,地图的键发生了变化,这破坏了一切。地图的键永远不能改变。因为我们使用的是 C++,所以你根本不应该使用char[];改为使用std::string它(因为它是“值类型”)将使一切都神奇地工作。我不知道它以前是如何工作的,因为您没有显示该printmap功能。

第二:您printmap每次阅读一行时都会调用,并且由于 amap无法打印“最后添加的内容”,因此该想法根本没有意义。该printmap调用可能应该打印整个地图,并且在循环之外。

第三:不要使用scanf,不安全。使用流:std::cin >> cc阅读单个单词,或std::getline(std::cin, nombre)阅读剩下的内容。这样,如果有人进入该行,代码就不会崩溃(最长国家名称最长姓氏的来源)

Krungthepmahanakornamornratanakosinmahintarayuttha-yamahadilokphopnopparatrajathaniburiromudomrajaniw-esmahasatharnamornphimarnavatarnsathitsakkattiyavi-sanukamprasit Wolfeschlegelsteinhausenbergerdorffvortschaferswesenchafewarenwholgepflegeunzenvonangereifenduchihrraubgiriigfeindtausendjahresvorandieerscheinenbanderechiffgebrauchlichtalsseinursprungvonkrrthinzwischensternartigraumaufdersuchebtbewohnbarplanetenkreisedrehensichundstandigmenshlichkeittkonntevortpflanzeslamdlichfreudeundruhemitnichteinfurchrintlligentgeschopfsvonhinzwischenster
于 2012-06-07T18:32:52.227 回答