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

Print map は、地図オブジェクトを印刷するだけの機能です。ここに私のファイル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キーに基づいてデータを並べ替えます。したがって、のテキストを置き換えると、マップのキーが変更され、すべてが壊れます。マップのキーは決して変更してはなりません。C ++を使用しているため、使用しないでください。代わりに使用してください。これは(「値型」であるため)すべてが魔法のように機能するようになります。機能を表示していないので、以前はどのように機能していたのかわかりません。char*char cc[75]ccchar[]std::stringprintmap

2番目:printmap1行を読むたびに電話をかけますが、 map「最後に追加されたもの」を印刷する方法がないため、そのアイデアはまったく意味がありません。printmap呼び出しはおそらくマップ全体を印刷し、ループの外側にあるはずです。

第三に:使用しないでくださいscanf、それは安全ではありません。ストリームを使用します。1std::cin >> ccつの単語std::getline(std::cin, nombre)を読み取る場合、または行に残っているものを読み取る場合。そうすれば、誰かがその行に入力してもコードがクラッシュすることはありません(最長の国名最長の姓のソース)

Krungthepmahanakornamornratanakosinmahintarayuttha-yamahadilokphopnopparatrajathaniburiromudomrajaniw-esmahasatharnamornphimarnavatarnsathitsakkattiyavi-sanukamprasit Wolfeschlegelsteinhausenbergerdorffvortschaferswesenchafewarenwholgepflegeunzenvonangereifenduchihrraubgiriigfeindtausendjahresvorandieerscheinenbanderechiffgebrauchlichtalsseinursprungvonkrrthinzwischensternartigraumaufdersuchebtbewohnbarplanetenkreisedrehensichundstandigmenshlichkeittkonntevortpflanzeslamdlichfreudeundruhemitnichteinfurchrintlligentgeschopfsvonhinzwischenster
于 2012-06-07T18:32:52.227 に答える