这段代码是这里代码的一个小修改:给定一个字符串数组,返回所有的字谜字符串组
我花了最近1小时阅读了map,set等文章的参考,但仍然无法理解。
#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 , anagrams 将包含:
act act
act cat
dgo god
现在,当我使用基于范围的循环时,它会打印这对的第二项。我的理解正确吗?我有两个问题。当我们使用 sortedWord 作为键时,它为什么不替换之前的值呢?例如,act cat 应该替换 act act。这是因为地图或集合的实施吗?第二个问题,当我尝试为以下输入打印 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,我将不胜感激。