4

前の質問に基づいて、単語とそのカウントのマッピングを に保存していmap<string, int>ます。それを逆にして、同じカウントを持つすべての単語がグループ化されるようにします。私の解決策は、を使用することでしたvector<vector<string> >。最初のベクトルのインデックスはカウントであり、2 番目のベクトルは単語のコレクションです。

前の質問への回答を読んだ後、ここで私が機能させようとしてきたもの:

  vector<vector<string> > sorted_words;
    for (map<string, int>::const_iterator it = counters.begin();
       it != counters.end(); ++it) {
    cout << "word:" << it->first
         << " count:" << it-> second
         << " vector size: " << sorted_words.size()
         << endl;

    if (sorted_words.size() - 1 > it->second && 
        sorted_words[ it->second ].size() > 0) {
      cout << "Adding " << it->first << endl;
      sorted_words[ it->second ].push_back(it->first);
    } else {
      cout << "Creating " << it->first << endl;
      vector<string> v;
      v.push_back(it->first);
      sorted_words.resize( it->second + 1 );
      sorted_words[it->second] = v;
    }
  }

これにより、ループの最初のパスである if ステートメントでセグメンテーション違反が発生します。

私がやろうとしているのは、現在の値がインバウンドになるように外側のベクトルのサイズが設定されているかどうか、そしてそうであれば、ネストされたベクトルを既に作成しているかどうかを確認することです。(マップは任意の順序で返される可能性があるため、これを行う必要があります。たとえば、最初の要素は <"foo", 3> になる可能性があります。)

基本的に C++ 以外の方法で行っている場合は、その点も指摘してください。

4

4 に答える 4

4

ワイルドなお尻のクイック推測: sorted_words.size()いくつかの符号なしタイプ (つまりsize_t) であるため、sorted_words.size() - 1(最初は) -1 であるべき場合でも符号なしであるため、常に最初の条件を渡し、 if 条件の後半を評価してクラッシュします。

于 2013-04-28T04:44:20.307 に答える
0

vector<vector<string>>または のような逆マップを使用する代わりに、既にmap<int, vector>あるマップ ( ) を利用して、同じカウントを持つすべての単語のインデックスを収集するために a を作成することができます。これにより、多くのスペースを節約できます。また、以前のものを変更するときは、インデックスを更新するだけで、他の 2 つのアプローチよりも高速になります。map<string, int>vector<vector<int>>map<string, int>vector<vector<int>>

于 2013-04-28T05:02:43.960 に答える