为什么迭代 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
现在,随着在每次迭代结束时添加一个新元素,我假设这会 运行 进入无限循环,但正如输出所示,它没有。
- 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 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<<" ";
}
}
我正在遍历 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 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<<" ";
}
}