您能在迭代过程中从std:list中删除元素吗?

您能在迭代过程中从std:list中删除元素吗?

我有这样的代码:

for (std::list<item*>::iterator i=items.begin();i!=items.end();i++){
    bool isActive = (*i)->update();
    //if (!isActive) 
    //  items.remove(*i); 
    //else
       other_code_involving(*i);}items.remove_if(CheckItemNotActive);

我希望在更新后立即删除不活动的项目,以避免再次浏览列表。但是,如果我添加注释行,当我到达i++*“列表迭代器不可递增”。我尝试了一些没有在for语句中增加的交替语句,但是我没有得到任何工作。

在您行走STD:List时,删除项目的最佳方法是什么?


尚方宝剑之说
浏览 2225回答 3
3回答

忽然笑

您必须先增加迭代器(使用I+),然后删除前一个元素(例如,使用I+返回的值)。您可以将代码更改为WITH循环,如下所示:std::list<item*>::iterator&nbsp;i&nbsp;=&nbsp;items.begin();while&nbsp;(i&nbsp;!=&nbsp;items.end()){ &nbsp;&nbsp;&nbsp;&nbsp;bool&nbsp;isActive&nbsp;=&nbsp;(*i)->update(); &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(!isActive) &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;items.erase(i++);&nbsp;&nbsp;//&nbsp;alternatively,&nbsp;i&nbsp;=&nbsp;items.erase(i); &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;else &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;other_code_involving(*i); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;++i; &nbsp;&nbsp;&nbsp;&nbsp;}}

SMILET

你想做的是:i=&nbsp;items.erase(i);这将正确地更新迭代器以指向您删除的迭代器之后的位置。

江户川乱折腾

你需要把克里斯托的答案和MSN的答案结合起来://&nbsp;Note:&nbsp;Using&nbsp;the&nbsp;pre-increment&nbsp;operator&nbsp;is&nbsp;preferred&nbsp;for&nbsp;iterators&nbsp;because//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;there&nbsp;can&nbsp;be&nbsp;a&nbsp;performance&nbsp;gain.////&nbsp;Note:&nbsp;As&nbsp;long&nbsp;as&nbsp;you&nbsp;are&nbsp;iterating&nbsp;from&nbsp;beginning&nbsp;to&nbsp;end,&nbsp;without&nbsp;inserting//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;along&nbsp;the&nbsp;way&nbsp;you&nbsp;can&nbsp;safely&nbsp;save&nbsp;end&nbsp;once;&nbsp;otherwise&nbsp;get&nbsp;it&nbsp;at&nbsp;the//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;top&nbsp;of&nbsp;each&nbsp;loop.std::list<&nbsp;item&nbsp;*&nbsp;>::iterator&nbsp;iter&nbsp;=&nbsp;items.begin();std::list<&nbsp;item&nbsp;*&nbsp;>::iterator&nbsp;end&nbsp;&nbsp;=&nbsp;items.end();while&nbsp;(iter&nbsp;!=&nbsp;end){ &nbsp;&nbsp;&nbsp;&nbsp;item&nbsp;*&nbsp;pItem&nbsp;=&nbsp;*iter; &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(pItem->update()&nbsp;==&nbsp;true) &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;other_code_involving(pItem); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;++iter; &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;else &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;BTW,&nbsp;who&nbsp;is&nbsp;deleting&nbsp;pItem,&nbsp;a.k.a.&nbsp;(*iter)? &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;iter&nbsp;=&nbsp;items.erase(iter); &nbsp;&nbsp;&nbsp;&nbsp;}}当然,最有效和超酷的STL Savy是这样的://&nbsp;This&nbsp;implementation&nbsp;of&nbsp;update&nbsp;executes&nbsp;other_code_involving(Item&nbsp;*)&nbsp;if//&nbsp;this&nbsp;instance&nbsp;needs&nbsp;updating.////&nbsp;This&nbsp;method&nbsp;returns&nbsp;true&nbsp;if&nbsp;this&nbsp;still&nbsp;needs&nbsp;future&nbsp;updates.//bool&nbsp;Item::update(void){ &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(m_needsUpdates&nbsp;==&nbsp;true) &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_needsUpdates&nbsp;=&nbsp;other_code_involving(this); &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;(m_needsUpdates);}//&nbsp;This&nbsp;call&nbsp;does&nbsp;everything&nbsp;the&nbsp;previous&nbsp;loop&nbsp;did!!!&nbsp;(Including&nbsp;the&nbsp;fact//&nbsp;that&nbsp;it&nbsp;isn't&nbsp;deleting&nbsp;the&nbsp;items&nbsp;that&nbsp;are&nbsp;erased!)items.remove_if(std::not1(std::mem_fun(&Item::update)));
打开App,查看更多内容
随时随地看视频慕课网APP