C++ 为什么迭代无序::map并添加新元素不会导致infinte循环?
我正在遍历一个C++ 为什么迭代无序::map并添加新元素不会导致infinte循环?,c++,stl,iterator,unordered-map,C++,Stl,Iterator,Unordered Map,我正在遍历一个std::无序的\u映射 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); } 现在,由于在每
std::无序的\u映射
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);
}
现在,由于在每次迭代结束时添加了一个新元素,我假设这将运行到一个无限循环中,但正如输出中所示,它没有运行
std::unordered_map
的迭代是通过遍历bucket来实现的。那么这是否意味着在我的代码中,插入到映射对(1,'b')
中的新值被散列到值对(0,'a')
的桶之前的桶中?”max\u load\u factor
并且无序映射重新灰化,会发生什么?整个无序映射是否再次迭代插入新元素会使迭代器在某个时候失效,但是,您会再次使用它们,因此 有关详细信息,请参阅 及 要查看此类行为,请使用以下代码
#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<<" ";
}
}
#包括
#包括
int main(){
std::无序地图mp;
mp[0]=“a”;
int i=1;
for(auto it=mp.begin();it!=mp.end();)
{
it=mp.insert({i++,(char)(97+i)});
std::cout插入新元素会使迭代器在某个时候失效,但是,您再次使用它们,因此
有关详细信息,请参阅
及
要查看此类行为,请使用以下代码
#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<<" ";
}
}
#包括
#包括
int main(){
std::无序地图mp;
mp[0]=“a”;
int i=1;
for(auto it=mp.begin();it!=mp.end();)
{
it=mp.insert({i++,(char)(97+i)});
std::coutIf操作符[]
调用会导致重新灰化,那么所有迭代器都将失效,程序在执行it++
时会显示未定义的行为。如果操作符[]
不会导致重新灰化,那么迭代器仍然有效。但是由于无序映射
是无序的,因此无法确定新元素是在迭代器指向的元素之前还是之后插入的,因此循环在后续迭代中可能会遇到它,也可能不会遇到它。如果size()
插入是安全的,迭代器将保持有效,无论插入是在迭代器指向的迭代器之前还是之后进行。@TEDLYNGO我是这么说的,不是吗?@IgorTandetnik哦,我误读了,对不起-我删除了你的名字tagIf操作符[]
调用会导致重新灰化,然后所有迭代器都会失效,程序在执行it++
时会显示未定义的行为。If操作符[]
不会导致重新灰化,那么迭代器仍然有效。但是由于无序映射
是无序的,因此无法确定新元素是在迭代器指向的元素之前还是之后插入的,因此循环在后续迭代中可能会遇到它,也可能不会遇到它。如果size()
插入是安全的,迭代器将保持有效,无论插入是在迭代器指向的迭代器之前还是之后进行。@TEDLYNGO我是这么说的,不是吗?@IgorTandetnik哦,我误读了,对不起-我删除了你的名称标记。你的意思是插入元素还是插入元素会导致像Igor上面所说的那样重新灰化?”插入元素会使迭代器无效”与您共享的链接中所说的不完全一样:“插入
和放置
成员不会影响迭代器的有效性,如果(N+N)@TedLyngmo我认为答案不必包含所有内容。我同意,但如果包含的内容是正确的,那就好了。你是说插入元素,还是像Igor上面说的那样,插入元素会导致重新灰化?“插入元素会使你的迭代器无效”并不是你共享的链接中所说的那样:“如果(N+N)@tedlynmo,那么插入
和安置
成员不应影响迭代器的有效性。我认为答案不必包含所有内容。我同意,但如果所包含的内容正确就好了。