![](https://iknow-base.cdn.bcebos.com/lxb/notice.png)
c++ 遍历map时删除当前元素正确方法
for(tmp_it=m_wcard.begin();tmp_it!=m_wcard.end();){m_wcard.erase(tmp_it++);}代码简化了,就是删...
for(tmp_it = m_wcard.begin(); tmp_it != m_wcard.end(); )
{
m_wcard.erase(tmp_it ++);
}
代码简化了,就是删除迭代器指向的当前的map里的元素,迭代器不会失效,我用了上述的办法程序直接崩溃
for(tmp_it = m_wcard.begin(); tmp_it != m_wcard.end(); )
{
if(!player->wcard.check_timeout(ttTimeBak))
{
player->Send_WeekCard(award_list,ttTimeBak,cardAward.start_time,interval);
++ tmp_it;
}
else{
player->wcard.wcard_type = 0;
ZLOG_DEBUG("username = %s",tmp_it->second->username.c_str());
std::map<int,player_ptr>::iterator it1 = tmp_it;
tmp_it ++;
m_wcard.erase(it1);
ZLOG_DEBUG("username = %s",tmp_it->second->username.c_str());
}
} 展开
{
m_wcard.erase(tmp_it ++);
}
代码简化了,就是删除迭代器指向的当前的map里的元素,迭代器不会失效,我用了上述的办法程序直接崩溃
for(tmp_it = m_wcard.begin(); tmp_it != m_wcard.end(); )
{
if(!player->wcard.check_timeout(ttTimeBak))
{
player->Send_WeekCard(award_list,ttTimeBak,cardAward.start_time,interval);
++ tmp_it;
}
else{
player->wcard.wcard_type = 0;
ZLOG_DEBUG("username = %s",tmp_it->second->username.c_str());
std::map<int,player_ptr>::iterator it1 = tmp_it;
tmp_it ++;
m_wcard.erase(it1);
ZLOG_DEBUG("username = %s",tmp_it->second->username.c_str());
}
} 展开
展开全部
如果是清空map的话建议用mp.clear()。
你的代码貌似是没有错的啊,用了dev-c++运行没有问题
这里是我的代码,运行无问题,与你的代码应该是一样的
for(map<int,int>::iterator it=mp.begin();it!=mp.end();)
mp.erase(it++);
是不是其它的语句影响的呢?
或者改为这个试试
for(map<int,int>::iterator it=mp.begin(),next;it!=mp.end();)
{
next=it;
next++;
mp.erase(it);
it=next;
}
你的代码貌似是没有错的啊,用了dev-c++运行没有问题
这里是我的代码,运行无问题,与你的代码应该是一样的
for(map<int,int>::iterator it=mp.begin();it!=mp.end();)
mp.erase(it++);
是不是其它的语句影响的呢?
或者改为这个试试
for(map<int,int>::iterator it=mp.begin(),next;it!=mp.end();)
{
next=it;
next++;
mp.erase(it);
it=next;
}
更多追问追答
追问
不是清空,我只是写了简单了。其实就删除当前迭代器指向的元素,运行就挂。迭代器失效,没有办法指向下个元素
追答
已经更新
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询