Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/150.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何绘制地图<;字符串,set<;字符串>&燃气轮机;这个代码中使用了什么?_C++_String_Stl - Fatal编程技术网

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的范围