如何解决为什么迭代无序:: 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
现在,由于在每次迭代的末尾添加了一个新元素,所以我认为这将陷入无限循环,但是如输出所示,它并没有出现。
- 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<<" ";
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。