为什么迭代 unordered::map 并添加新元素不会导致死循环?

Why does iterating unordered::map and adding new elements does not lead to an infinte loop?

我正在遍历 std::unordered_map

    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);
    }

输出

a

现在,随着在每次迭代结束时添加一个新元素,我假设这会 运行 进入无限循环,但正如输出所示,它没有。

  1. By seeing this link 我意识到 std::unordered_map 的迭代是通过遍历桶发生的。那么这是否意味着在我的代码中,插入到我的映射 pair<int,char>(1,'b') 中的新值被散列到值 pair<int,char>(0,'a')
  2. 的桶之前的桶中
  3. 如果是,那么如果负载因子超过 max_load_factor 并且 unordered_map 重新散列会发生什么?整个unordered_map是否再次迭代?

插入新元素有时会使您的迭代器失效,但是,您再次使用它们,因此 UB

详情请见 Iterator invalidation rules and

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

#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<<" ";

    }
}