STL迭代器遍历中删除元素问题

来源:互联网 发布:edius for mac 编辑:程序博客网 时间:2024/05/16 19:35
STL的管理对象的管理器一般会给上层提供回调函数形如:templete<typename Entry>struct CallBack{      bool exec(Entry* entry)=0;}templete<typename Entry>struct Manager{     bool add_entry()    {    }    void remove_entry()    {     <span style="color:#FFFFFF;"> <span style="background-color: rgb(153, 255, 153);"> assert(!is_traverse)</span></span>    }     void foreach(CallBack<Entry>* callback)     {<span style="background-color: rgb(153, 255, 153);">is_traverse = true;</span>              for(it=_map.begin();it!=_map.end();++it)             {                   if(!callback(entry))                    break;              }              <span style="background-color: rgb(153, 255, 153);"> is_traverse = false;</span>     }std::map<int,Entry*> _map;bool is_traverse = false; }如果在上层给的回调函数中有删除的操作,调用了管理器的remove_entry方法,会引起遍历迭代器的紊乱,导致宕机。有以下几种解决办法:1、对写上层回调强制规定不能删除。2、改写在遍历时设置一个内部标记,调用remove_entry时,检查有无标记,如果有,则报警。如上面的绿色代码。3、遍历时,先将内容放入临时容器内,再进行遍历。


0 0
原创粉丝点击