前の質問に基づいて、単語とそのカウントのマッピングを に保存してい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++ 以外の方法で行っている場合は、その点も指摘してください。