C++ 如何绘制地图<;字符串,set<;字符串>&燃气轮机;这个代码中使用了什么?
此代码是此处代码的轻微修改:C++ 如何绘制地图<;字符串,set<;字符串>&燃气轮机;这个代码中使用了什么?,c++,string,stl,C++,String,Stl,此代码是此处代码的轻微修改: 在过去的一个小时里,我一直在阅读地图、布景和其他文章的参考资料,但仍然无法理解 #include <map> #include <iostream> #include <set> #include <algorithm> using namespace std; int main(){ int n; cin >>n; string word;
在过去的一个小时里,我一直在阅读地图、布景和其他文章的参考资料,但仍然无法理解
#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";
}
}
它使用我们的排序字作为键,并将这对字插入到字谜中。现在,当我继续插入对时,字谜会根据sortedWord自动排序。例如,如果我插入cat,god,按此顺序操作,字谜将包含:
act act
act cat
dgo god
现在,当我使用基于范围的循环时,它会打印这对循环中的第二项。我的理解正确吗?
我有两个问题。当我们使用sortedWord作为键时,为什么它不替换先前的值?例如,act cat应该取代act。这是因为map还是set的实现?第二个问题,当我尝试打印pair时。首先,对于以下输入,我得到一些随机输出:
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,我将不胜感激。对于std::map
,当您这样做时:
anagrams[sortedWord].insert(word);
它将返回对存储在sortedWord
的std::set
的引用,或者(本质上)创建一个新的set
并将其存储在该键上。由于没有为其分配集合
,因此不会替换集合
。但在这种情况下,每次您对sortedWord
具有相同的值时,它都会通过std::set
上的insert
方法添加到现有集合中
就对.first
输出而言,它不是随机的。在映射中,您迭代键和值(键为first
,值为second
)。所以在本例中,pair.first
是来自sortedWords
的字符串。因此,第一次迭代是act
,第二次迭代是dgo
。由于您随后对这些字符串对象进行迭代,因此可以获得单个字符
就结构而言,您的地图可以可视化为:
(key) -> (value - set)
act -> act cat tac
dgo -> dog god
对于std::map
,执行此操作时:
anagrams[sortedWord].insert(word);
它将返回对存储在sortedWord
的std::set
的引用,或者(本质上)创建一个新的set
并将其存储在该键上。由于没有为其分配集合
,因此不会替换集合
。但在这种情况下,每次您对sortedWord
具有相同的值时,它都会通过std::set
上的insert
方法添加到现有集合中
就对.first
输出而言,它不是随机的。在映射中,您迭代键和值(键为first
,值为second
)。所以在本例中,pair.first
是来自sortedWords
的字符串。因此,第一次迭代是act
,第二次迭代是dgo
。由于您随后对这些字符串对象进行迭代,因此可以获得单个字符
就结构而言,您的地图可以可视化为:
(key) -> (value - set)
act -> act cat tac
dgo -> dog god
首先,为什么
映射中的键不替换东西?
该守则是这样做的:
string sortedWord(word);
sort(sortedWord.begin(), sortedWord.end());
anagrams[sortedWord].insert(word);
因此,对于任何单词,它都是先排序的,例如
act -> act
cat -> act
排序后的版本用作键,以查找适当的值,即字符串的std::set
。未排序的版本,word
插入到集合中。这不会取代以前的情况。
其次,如果您在字符串上使用基于范围的for循环,您将得到每个字母。首先,为什么映射中的键不替换东西?
该守则是这样做的:
string sortedWord(word);
sort(sortedWord.begin(), sortedWord.end());
anagrams[sortedWord].insert(word);
因此,对于任何单词,它都是先排序的,例如
act -> act
cat -> act
排序后的版本用作键,以查找适当的值,即字符串的std::set
。未排序的版本,word
插入到集合中。这不会取代以前的情况。
其次,如果在字符串上使用基于范围的for循环,则将得到每个字母
anagrams[sortedWord]。插入(word)代码>
它使用我们的排序字作为键,并将这对字插入到字谜中
不完全正确<代码>字谜
是一个容器,其中每个键都映射到集合
。这意味着,在字谜[key]
中可以有很多值,但它们永远不会重复
考虑输入:cat-act-dog-god-none-cat
,字谜将更像这样:
anagrams-+-act-+-act
| +-cat
|
+-dgo-+-dog
| +-god
|
+-enno-+-none
请注意,cat
不会有重复项,dog
和god
输入将存储在无意义的dgo
键下
当您迭代该对的第一个值时,您会得到键,但由于键不是set
,而是string
,所以您会得到单个字符而不是单词
在我的示例中,您将得到类似于a c t d g o e n o
的内容,这正是来自键的字符
anagrams[sortedWord]。插入(word)代码>
它使用我们的排序字作为键,并将这对字插入到字谜中
不完全正确<代码>字谜
是一个容器,其中每个键都映射到集合
。这意味着,在字谜[key]
中可以有很多值,但它们永远不会重复
考虑输入:cat-act-dog-god-none-cat
,字谜将更像这样:
anagrams-+-act-+-act
| +-cat
|
+-dgo-+-dog
| +-god
|
+-enno-+-none
请注意,cat
不会有重复项,dog
和god
输入将存储在无意义的dgo
键下
当您迭代该对的第一个值时,您会得到键,但由于键不是set
,而是string
,所以您会得到单个字符而不是单词
在我的示例中,您将得到类似于的c t d g o e n n o
,这正是键中的字符。pair.first是一个std::string,因此基于范围的for循环会告诉您每个字符letter@SJuan76:在std::set
中,顺序不重要。没有顺序的集合将是std::unordered\u set
.pair。第一个是std::string,因此是基于循环te的范围