问题描述
我正在遍历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
现在,由于在每次迭代的末尾添加了一个新元素,所以我认为这将陷入无限循环,但是如输出所示,它并没有出现。
- By seeing this link我意识到
std::unordered_map
的迭代是通过遍历存储桶而发生的。这是否意味着在我的代码中,插入到地图pair<int,char>(1,'b')
中的新值在值pair<int,char>(0,'a')
“ 的存储桶之前被散列到存储桶中
- 如果是,那么如果负载系数超过
max_load_factor
且unordered_map重新哈希,会发生什么?整个unordered_map是否会再次迭代?
解决方法
插入新元素会使您的迭代器在某些时候失效,但是,您会再次使用它们,因此UB
有关详细信息,请参见 Iterator invalidation rules和iterator 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<<" ";
}
}