如何在迭代时从地图中删除?

如何在迭代时从地图中删除?

如何在迭代时从地图中删除?喜欢:

std::map<K, V> map;for(auto i : map)
    if(needs_removing(i))
        // remove it from the map

如果我使用map.erase它将使迭代器无效


海绵宝宝撒
浏览 347回答 3
3回答

慕尼黑5688855

我个人更喜欢这种模式,它更加清晰和简单,代价是额外的变量:for&nbsp;(auto&nbsp;it&nbsp;=&nbsp;m.cbegin(),&nbsp;next_it&nbsp;=&nbsp;it;&nbsp;it&nbsp;!=&nbsp;m.cend();&nbsp;it&nbsp;=&nbsp;next_it){ &nbsp;&nbsp;++next_it; &nbsp;&nbsp;if&nbsp;(must_delete) &nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;m.erase(it); &nbsp;&nbsp;}}这种方法的优点:for循环增量器作为增量器是有意义的;擦除操作是简单的擦除,而不是与增量逻辑混合;在循环体的第一行之后,整个迭代中的含义it和next_it保持固定,允许您轻松添加引用它们的其他语句,而不必头脑确定它们是否会按预期工作(当然除了it擦除后不能使用) 。

小怪兽爱吃肉

简而言之“如何在迭代时从地图中删除?”用旧地图impl:你不能随着新的地图impl:几乎像@KerrekSB建议的那样。但他发布的内容存在一些语法问题。来自GCC map impl(注意GXX_EXPERIMENTAL_CXX0X):#ifdef&nbsp;__GXX_EXPERIMENTAL_CXX0X__&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;_GLIBCXX_RESOLVE_LIB_DEFECTS &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;DR&nbsp;130.&nbsp;Associative&nbsp;erase&nbsp;should&nbsp;return&nbsp;an&nbsp;iterator. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/** &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;@brief&nbsp;Erases&nbsp;an&nbsp;element&nbsp;from&nbsp;a&nbsp;%map. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;@param&nbsp;&nbsp;position&nbsp;&nbsp;An&nbsp;iterator&nbsp;pointing&nbsp;to&nbsp;the&nbsp;element&nbsp;to&nbsp;be&nbsp;erased. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;@return&nbsp;An&nbsp;iterator&nbsp;pointing&nbsp;to&nbsp;the&nbsp;element&nbsp;immediately&nbsp;following &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@a&nbsp;position&nbsp;prior&nbsp;to&nbsp;the&nbsp;element&nbsp;being&nbsp;erased.&nbsp;If&nbsp;no&nbsp;such&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;element&nbsp;exists,&nbsp;end()&nbsp;is&nbsp;returned. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;* &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;This&nbsp;function&nbsp;erases&nbsp;an&nbsp;element,&nbsp;pointed&nbsp;to&nbsp;by&nbsp;the&nbsp;given &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;iterator,&nbsp;from&nbsp;a&nbsp;%map.&nbsp;&nbsp;Note&nbsp;that&nbsp;this&nbsp;function&nbsp;only&nbsp;erases &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;the&nbsp;element,&nbsp;and&nbsp;that&nbsp;if&nbsp;the&nbsp;element&nbsp;is&nbsp;itself&nbsp;a&nbsp;pointer, &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;the&nbsp;pointed-to&nbsp;memory&nbsp;is&nbsp;not&nbsp;touched&nbsp;in&nbsp;any&nbsp;way.&nbsp;&nbsp;Managing &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;the&nbsp;pointer&nbsp;is&nbsp;the&nbsp;user's&nbsp;responsibility. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;iterator &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;erase(iterator&nbsp;__position) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;return&nbsp;_M_t.erase(__position);&nbsp;}#else &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/** &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;@brief&nbsp;Erases&nbsp;an&nbsp;element&nbsp;from&nbsp;a&nbsp;%map. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;@param&nbsp;&nbsp;position&nbsp;&nbsp;An&nbsp;iterator&nbsp;pointing&nbsp;to&nbsp;the&nbsp;element&nbsp;to&nbsp;be&nbsp;erased. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;* &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;This&nbsp;function&nbsp;erases&nbsp;an&nbsp;element,&nbsp;pointed&nbsp;to&nbsp;by&nbsp;the&nbsp;given &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;iterator,&nbsp;from&nbsp;a&nbsp;%map.&nbsp;&nbsp;Note&nbsp;that&nbsp;this&nbsp;function&nbsp;only&nbsp;erases &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;the&nbsp;element,&nbsp;and&nbsp;that&nbsp;if&nbsp;the&nbsp;element&nbsp;is&nbsp;itself&nbsp;a&nbsp;pointer, &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;the&nbsp;pointed-to&nbsp;memory&nbsp;is&nbsp;not&nbsp;touched&nbsp;in&nbsp;any&nbsp;way.&nbsp;&nbsp;Managing &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;the&nbsp;pointer&nbsp;is&nbsp;the&nbsp;user's&nbsp;responsibility. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;void &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;erase(iterator&nbsp;__position) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;_M_t.erase(__position);&nbsp;}#endif旧样式和新样式的示例:#include&nbsp;<iostream>#include&nbsp;<map>#include&nbsp;<vector>#include&nbsp;<algorithm>using&nbsp;namespace&nbsp;std;typedef&nbsp;map<int,&nbsp;int>&nbsp;t_myMap;typedef&nbsp;vector<t_myMap::key_type>&nbsp;&nbsp;t_myVec;int&nbsp;main()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;<<&nbsp;"main()&nbsp;ENTRY"&nbsp;<<&nbsp;endl; &nbsp;&nbsp;&nbsp;&nbsp;t_myMap&nbsp;mi; &nbsp;&nbsp;&nbsp;&nbsp;mi.insert(t_myMap::value_type(1,1)); &nbsp;&nbsp;&nbsp;&nbsp;mi.insert(t_myMap::value_type(2,1)); &nbsp;&nbsp;&nbsp;&nbsp;mi.insert(t_myMap::value_type(3,1)); &nbsp;&nbsp;&nbsp;&nbsp;mi.insert(t_myMap::value_type(4,1)); &nbsp;&nbsp;&nbsp;&nbsp;mi.insert(t_myMap::value_type(5,1)); &nbsp;&nbsp;&nbsp;&nbsp;mi.insert(t_myMap::value_type(6,1)); &nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;<<&nbsp;"Init"&nbsp;<<&nbsp;endl; &nbsp;&nbsp;&nbsp;&nbsp;for(t_myMap::const_iterator&nbsp;i&nbsp;=&nbsp;mi.begin();&nbsp;i&nbsp;!=&nbsp;mi.end();&nbsp;i++) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;<<&nbsp;'\t'&nbsp;<<&nbsp;i->first&nbsp;<<&nbsp;'-'&nbsp;<<&nbsp;i->second&nbsp;<<&nbsp;endl; &nbsp;&nbsp;&nbsp;&nbsp;t_myVec&nbsp;markedForDeath; &nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(t_myMap::const_iterator&nbsp;it&nbsp;=&nbsp;mi.begin();&nbsp;it&nbsp;!=&nbsp;mi.end()&nbsp;;&nbsp;it++) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(it->first&nbsp;>&nbsp;2&nbsp;&&&nbsp;it->first&nbsp;<&nbsp;5) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;markedForDeath.push_back(it->first); &nbsp;&nbsp;&nbsp;&nbsp;for(size_t&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;<&nbsp;markedForDeath.size();&nbsp;i++) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;old&nbsp;erase,&nbsp;returns&nbsp;void... &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mi.erase(markedForDeath[i]); &nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;<<&nbsp;"after&nbsp;old&nbsp;style&nbsp;erase&nbsp;of&nbsp;3&nbsp;&&nbsp;4.."&nbsp;<<&nbsp;endl; &nbsp;&nbsp;&nbsp;&nbsp;for(t_myMap::const_iterator&nbsp;i&nbsp;=&nbsp;mi.begin();&nbsp;i&nbsp;!=&nbsp;mi.end();&nbsp;i++) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;<<&nbsp;'\t'&nbsp;<<&nbsp;i->first&nbsp;<<&nbsp;'-'&nbsp;<<&nbsp;i->second&nbsp;<<&nbsp;endl; &nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(auto&nbsp;it&nbsp;=&nbsp;mi.begin();&nbsp;it&nbsp;!=&nbsp;mi.end();&nbsp;)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(it->first&nbsp;==&nbsp;5) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;new&nbsp;erase()&nbsp;that&nbsp;returns&nbsp;iter.. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;it&nbsp;=&nbsp;mi.erase(it); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;++it; &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;<<&nbsp;"after&nbsp;new&nbsp;style&nbsp;erase&nbsp;of&nbsp;5"&nbsp;<<&nbsp;endl; &nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;new&nbsp;cend/cbegin&nbsp;and&nbsp;lambda.. &nbsp;&nbsp;&nbsp;&nbsp;for_each(mi.cbegin(),&nbsp;mi.cend(),&nbsp;[](t_myMap::const_reference&nbsp;it){cout&nbsp;<<&nbsp;'\t'&nbsp;<<&nbsp;it.first&nbsp;<<&nbsp;'-'&nbsp;<<&nbsp;it.second&nbsp;<<&nbsp;endl;}); &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;0;}打印:main()&nbsp;ENTRYInit &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1-1 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2-1 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3-1 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4-1 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;5-1 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;6-1after&nbsp;old&nbsp;style&nbsp;erase&nbsp;of&nbsp;3&nbsp;&&nbsp;4.. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1-1 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2-1 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;5-1 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;6-1after&nbsp;new&nbsp;style&nbsp;erase&nbsp;of&nbsp;5 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1-1 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2-1 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;6-1Process&nbsp;returned&nbsp;0&nbsp;(0x0)&nbsp;&nbsp;&nbsp;execution&nbsp;time&nbsp;:&nbsp;0.021&nbsp;sPress&nbsp;any&nbsp;key&nbsp;to&nbsp;continue.
打开App,查看更多内容
随时随地看视频慕课网APP