为什么迭代无序:: map和添加新元素不会导致无限循环?

问题描述

我正在遍历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 rulesiterator invalidation in map C++

要查看这种行为,请使用以下代码

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

    }
}