Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/160.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++ 为什么迭代无序::map并添加新元素不会导致infinte循环?_C++_Stl_Iterator_Unordered Map - Fatal编程技术网

C++ 为什么迭代无序::map并添加新元素不会导致infinte循环?

C++ 为什么迭代无序::map并添加新元素不会导致infinte循环?,c++,stl,iterator,unordered-map,C++,Stl,Iterator,Unordered Map,我正在遍历一个std::无序的\u映射 std::unordered_map<int, char> mp; mp[0] = 'a'; int i = 1; for(auto it=mp.begin();it!=mp.end();it++) { cout<<it->second<<" "; mp[i++] = (char)(97+i); } 现在,由于在每

我正在遍历一个
std::无序的\u映射

    std::unordered_map<int, char> mp;
    mp[0] = 'a';
    int i = 1;
    for(auto it=mp.begin();it!=mp.end();it++)
    {
        cout<<it->second<<" ";
        mp[i++] = (char)(97+i);
    }
现在,由于在每次迭代结束时添加了一个新元素,我假设这将运行到一个无限循环中,但正如输出中所示,它没有运行

  • 我意识到,
    std::unordered_map
    的迭代是通过遍历bucket来实现的。那么这是否意味着在我的代码中,插入到映射
    对(1,'b')
    中的新值被散列到值
    对(0,'a')
    的桶之前的桶中?”
  • 如果是,那么如果加载因子超过了
    max\u load\u factor
    并且无序映射重新灰化,会发生什么?整个无序映射是否再次迭代

  • 插入新元素会使迭代器在某个时候失效,但是,您会再次使用它们,因此

    有关详细信息,请参阅 及

    要查看此类行为,请使用以下代码

    #include <iostream>
    #include <unordered_map>
    
    
    int main(){
        std::unordered_map<int, char> mp;
        mp[0] = 'a';
        int i = 1;
        for(auto it = mp.begin(); it!= mp.end();)
        {
            it = mp.insert({i++, (char)(97+i)}).first;
            std::cout<<it->second<<" ";
    
        }
    }
    
    #包括
    #包括
    int main(){
    std::无序地图mp;
    mp[0]=“a”;
    int i=1;
    for(auto it=mp.begin();it!=mp.end();)
    {
    it=mp.insert({i++,(char)(97+i)});
    
    std::cout插入新元素会使迭代器在某个时候失效,但是,您再次使用它们,因此

    有关详细信息,请参阅 及

    要查看此类行为,请使用以下代码

    #include <iostream>
    #include <unordered_map>
    
    
    int main(){
        std::unordered_map<int, char> mp;
        mp[0] = 'a';
        int i = 1;
        for(auto it = mp.begin(); it!= mp.end();)
        {
            it = mp.insert({i++, (char)(97+i)}).first;
            std::cout<<it->second<<" ";
    
        }
    }
    
    #包括
    #包括
    int main(){
    std::无序地图mp;
    mp[0]=“a”;
    int i=1;
    for(auto it=mp.begin();it!=mp.end();)
    {
    it=mp.insert({i++,(char)(97+i)});
    
    std::coutIf
    操作符[]
    调用会导致重新灰化,那么所有迭代器都将失效,程序在执行
    it++
    时会显示未定义的行为。如果
    操作符[]
    不会导致重新灰化,那么迭代器仍然有效。但是由于
    无序映射
    是无序的,因此无法确定新元素是在迭代器指向的元素之前还是之后插入的,因此循环在后续迭代中可能会遇到它,也可能不会遇到它。如果
    size()
    插入是安全的,迭代器将保持有效,无论插入是在迭代器指向的迭代器之前还是之后进行。@TEDLYNGO我是这么说的,不是吗?@IgorTandetnik哦,我误读了,对不起-我删除了你的名字tagIf
    操作符[]
    调用会导致重新灰化,然后所有迭代器都会失效,程序在执行
    it++
    时会显示未定义的行为。If
    操作符[]
    不会导致重新灰化,那么迭代器仍然有效。但是由于
    无序映射
    是无序的,因此无法确定新元素是在迭代器指向的元素之前还是之后插入的,因此循环在后续迭代中可能会遇到它,也可能不会遇到它。如果
    size()
    插入是安全的,迭代器将保持有效,无论插入是在迭代器指向的迭代器之前还是之后进行。@TEDLYNGO我是这么说的,不是吗?@IgorTandetnik哦,我误读了,对不起-我删除了你的名称标记。你的意思是插入元素还是插入元素会导致像Igor上面所说的那样重新灰化?”插入元素会使迭代器无效”与您共享的链接中所说的不完全一样:“
    插入
    放置
    成员不会影响迭代器的有效性,如果
    (N+N)@TedLyngmo我认为答案不必包含所有内容。我同意,但如果包含的内容是正确的,那就好了。你是说插入元素,还是像Igor上面说的那样,插入元素会导致重新灰化?“插入元素会使你的迭代器无效”并不是你共享的链接中所说的那样:“如果
    (N+N)@tedlynmo,那么
    插入
    安置
    成员不应影响迭代器的有效性。我认为答案不必包含所有内容。我同意,但如果所包含的内容正确就好了。