std :: map表现不如预期

时间:2012-06-07 18:23:15

标签: 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);
    }
}

打印地图是一种只打印地图对象的功能。这是我的文件input.txt

3
Spain Donna Elvira
England Jane Doe
Spain Donna Anna

执行程序时,输出为:

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

我的期望是:

Spain -> 2
England -> 1

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

1 个答案:

答案 0 :(得分: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,因为map无法打印“最后添加的内容”,这个想法完全没有意义。 printmap调用可能应该打印整个地图,并且在循环之外。

第三:不要使用scanf,这不安全。使用流:std::cin >> cc用于单个单词读取,或std::getline(std::cin, nombre)用于读取行中剩余的内容。这样,如果有人进入该行,代码就不会崩溃(longest country namelongest last name的来源)

Krungthepmahanakornamornratanakosinmahintarayuttha-yamahadilokphopnopparatrajathaniburiromudomrajaniw-esmahasatharnamornphimarnavatarnsathitsakkattiyavi-sanukamprasit Wolfeschlegelsteinhausenbergerdorffvortschaferswesenchafewarenwholgepflegeunzenvonangereifenduchihrraubgiriigfeindtausendjahresvorandieerscheinenbanderechiffgebrauchlichtalsseinursprungvonkrrthinzwischensternartigraumaufdersuchebtbewohnbarplanetenkreisedrehensichundstandigmenshlichkeittkonntevortpflanzeslamdlichfreudeundruhemitnichteinfurchrintlligentgeschopfsvonhinzwischenster