このコードは、ここのコードを少し変更したものです。文字列配列が与えられた場合、
過去 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 のさらなる使用方法を教えてくれたらありがたいです。