1

このコードは、ここのコードを少し変更したものです。文字列配列が与えられた場合、 過去 1 時間マップ、セット、およびその他の記事の参照を読んでいるが、まだ理解できないアナグラムである文字列のすべてのグループを返します。

   #include <map>
    #include <iostream>
    #include <set>
    #include <algorithm>
    using namespace std;
 int main(){
    int n; cin >>n;
    string word;
    map<string, set<string> > anagrams;
    for (int i=0;i<n;i++){
        cin >> word;
        string sortedWord(word);
        sort(sortedWord.begin(), sortedWord.end());
        anagrams[sortedWord].insert(word);
    }
    for (auto& pair : anagrams){
        for (auto& word: pair.second){
            cout << word << " ";
        }
        //cout << "\n";
    }
}

私が理解しているように、セットは順序付きベクトルではありません。このコード行に到達すると

anagrams[sortedWord].insert(word);

sortedWord をキーとして使用し、ペアをアナグラムに挿入します。ペアを挿入し続けると、アナグラムは sortedWord に基づいて自動的にソートされます。たとえば、 cat 、 god 、 act をこの順序で挿入すると、アナグラムには次のものが含まれます。

act act
act cat
dgo god

範囲ベースのループを使用すると、このペアの 2 番目の項目が出力されます。私の理解は正しいですか?2 つの質問があります。sortedWord をキーとして使用する場合、以前の値を置き換えないのはなぜですか? たとえば、act cat は act act を置き換える必要があります。これは map または set の実装によるものですか? そして2番目の質問は、次の入力に対してpair.firstを出力しようとすると、ランダムな出力が得られます:

Input:
5
cat act dog tac god
Output(for pair.second):
act cat tac dog god
Output(for pair.first):
a c t d g o 

また、誰かが set のさらなる使用方法を教えてくれたらありがたいです。

4

3 に答える 3

3

anagrams[sortedWord].insert(word);

sortedWord をキーとして使用し、ペアをアナグラムに挿入します。

正確ではありません。anagramsは、すべてのキーが にマップされるコンテナsetです。これは、 内に多くの値を持つことができることを意味しますが、anagrams[key]重複することはありません。

input: を考慮するとcat act dog god none cat、アナグラムは次のようになります。

anagrams-+-act-+-act
         |     +-cat
         |
         +-dgo-+-dog
         |     +-god
         |
         +-enno-+-none

cat、両方の重複はなくdoggod入力は無意味なdgoキーの下に保存されることに注意してください。

ペアの最初の値を反復処理すると、キーが取得されますが、キーは ではないためsetstring単語ではなく個々の文字が取得されます。

私の例a c t d g o e n n oでは、キーからの正確な文字のようなものが得られます。

于 2013-10-08T12:45:54.660 に答える
1

まず、なぜ鍵がmap<string, set<string> >物事を置き換えないのですか? コードはこれを行います:

string sortedWord(word);
sort(sortedWord.begin(), sortedWord.end());
anagrams[sortedWord].insert(word);

したがって、どの単語でも、最初にソートされます。

act -> act
cat -> act

ソートされたバージョンはキーとして使用され、文字列の適切な値を見つけstd::setます。ソートされていないバージョンwordがセットに挿入されます。これは、以前にあったものを置き換えるものではありません。
次に、文字列に対して範囲ベースの for ループを使用すると、各文字が取得されます。

于 2013-10-08T12:45:38.457 に答える