1

このプログラムは、ペアをマップに格納し、単語の出現回数をカウントします。目標は、データを出現回数でソートし、値/文字列形式で出力することです。法線マップは明らかに文字列キーでソートされるため、逆にする必要がありました。

これを行うために、私は言葉を読み、それらの値をマップで適切に増やします。次に、マルチマップを作成し、ペアをマップからマルチマップにコピーしますが、逆にします。次に、マルチマップを反復処理して、ペアを出力します。ただし、ペアを出力しようとすると実行時エラーが発生し、その理由がわかりません。

コードは次のとおりです。

#include <map>
#include <string>
#include <iostream>
using namespace std;

int main()
{
    map<string, int> words;
    multimap<int, string> words2;

    string s;
    while (true) {
        cin >> s;
        if (s == "0") break;
        ++words[s];
    }

    map<string, int>::iterator p;
    for (p = words.begin(); p!=words.end(); ++p)
        words2.insert(make_pair(p->second, p->first));

    multimap<int, string>::iterator p2;
    for (p2 = words2.begin(); p2!=words2.end(); ++p2)
        cout << p->first << ": " << p->second << '\n';
}

どんな助けでも大歓迎です。

PS私は、マルチマップがキーの複数の出現(最初にそれを使用した理由です)および/または単一のキーで複数の値を持つことができることをさまざまな場所で読みました。どちらが正しいか、または両方が正しいかについて、いくつかの明確化が必要です。

また、マップのコピー アルゴリズムの種類はありますか? 簡単にするために for ループを使用することにしました。おそらくカスタム コピーを作成するのはかなり簡単でしょうが、(マップを他のペア コンテナーにコピーし、出力にコピーするため)

4

3 に答える 3

2
 for (p2 = words2.begin(); p2!=words2.end(); ++p2)
        cout << p->first << ": " << p->second << '\n';

出力ステートメントの p は p2 ではありませんか?

于 2009-08-30T16:28:23.520 に答える
1

印刷時に p2 ではなく p を使用しているようです。出力行を次のように変更します。

cout << p2->first << ": " << p2->second << '\n';

最初の for ループが終了した後に範囲外になるため、 for ループの前ではなく for ループで p を宣言した場合、このエラーは回避されます。

于 2009-08-30T16:29:00.307 に答える
0

これは2009年のものであることは知っていますが、質問の2番目の部分に答えるために、はい、std範囲間で要素をコピーするアルゴリズムがあります。同じ値の型を持つコンテナー間でコピーする場合、std::copywithを使用すると次のようにstd::inserterなります。

map<string, int> wordsA;
multimap<string, int> wordsB;
copy(wordsA.begin(), words.end(), inserter(wordsB, wordsB.begin()));

異なるタイプのコンテナにコピーしているのでstd::transform、要素を 2 番目のコンテナに挿入する前に、要素に変換関数を適用するために使用できます。

transform(words.begin(), words.end(), 
          std::inserter(words2, words2.begin()),
          [](const pair<string, int>& x) -> pair<int, string>
          {
              return make_pair(x.second, x.first);
          }
          );

よくあることですが、これは実際には単純なループよりも多くのコード行になり、本質的に同じことを行います:)

std::copyなどは、 のstd::transformほとんどすべてのコンテナで機能することに注意してくださいstd。これは に固有のものではありませんstd::map。resp . _ std::front_inserter_ メソッド。std::back_inserterpush_front()push_back()

于 2015-03-02T06:34:00.903 に答える