标准::地图未按预期运行

std::map not behaving as expected

本文关键字:运行 地图 标准      更新时间:2023-10-16

我正在尝试使用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);
    }
}
打印地图

是一个只打印地图对象的函数。这是我的文件输入.txt

3
Spain Donna Elvira
England Jane Doe
Spain Donna Anna

当我执行程序时,输出是:

Spain -> 1
England -> 2
Spain -> 1

我的期望是:

Spain -> 2
England -> 1

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

作为我上面评论的解决方案,您提供的代码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,而且由于map无法打印"最后添加的东西",所以这个想法根本没有意义。printmap调用可能应该打印整个地图,并且位于循环之外。

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

Krungthepmahanakornamornratanakosinmahintarayuttha-yamahadilokphopnopparatrajathaniburiromudomrajaniw-esmahasatharnamornphimarnavatarnsathitsakkattiyavi-sanukamprasit Wolfeschlegelsteinhausenbergerdorffvortschaferswesenchafewarenwholgepflegeunzenvonangereifenduchihrraubgiriigfeindtausendjahresvorandieerscheinenbanderechiffgebrauchlichtalsseinursprungvonkrrthinzwischensternartigraumaufdersuchebtbewohnbarplanetenkreisedrehensichundstandigmenshlichkeittkonntevortpflanzeslamdlichfreudeundruhemitnichteinfurchrintlligentgeschopfsvonhinzwischenster