一個更優雅的解決辦法是切換到std::list
(假設你並不需要快速隨機訪問)。
list<Widget*> widgets ; // create and use this..
你可以接着用.remove_if
和某行的C++函數對象刪除:
widgets.remove_if([](Widget*w){ return w->isExpired() ; }) ;
所以在這裏,我只是寫一個接受一個參數(Widget*
)仿函數。返回值是從列表中刪除Widget*
的條件。
我覺得這個語法可口。我不認爲我會使用remove_if
爲std::vectors - 有這麼多inv.begin()
和inv.end()
噪聲那裏你可能會更好使用an integer-index-based delete或只是一個普通的舊的常規基於迭代器的刪除(如下所示)。但是,您不應該真的從std::vector
的中間刪除,因此建議您切換到list
以處理這種頻繁中途刪除的情況。
但請注意,我沒有機會致電Widget*
的delete
已刪除。要做到這一點,就應該是這樣的:
widgets.remove_if([](Widget*w){
bool exp = w->isExpired() ;
if(exp) delete w ; // delete the widget if it was expired
return exp ; // remove from widgets list if it was expired
}) ;
你也可以使用常規的基於迭代器的循環,像這樣:
// NO INCREMENT v
for(list<Widget*>::iterator iter = widgets.begin() ; iter != widgets.end() ;)
{
if((*iter)->isExpired())
{
delete(*iter) ;
iter = widgets.erase(iter) ; // _advances_ iter, so this loop is not infinite
}
else
++iter ;
}
如果你不喜歡的for(list<Widget*>::iterator iter = widgets.begin() ; ...
的長度,你可以使用
for(auto iter = widgets.begin() ; ...
如果你想獲得幻想,你可以使用'與謂詞「做的東西」的std :: remove_if'然後如果你想刪除該元素則返回true。 – 2012-04-28 04:06:11
是否有一個原因,你不能只是添加一個索引計數器,然後使用像inv.erase(索引)這樣的東西? – TomJ 2012-04-28 04:06:33
@TomJ:這仍然會影響迭代。 – 2012-04-28 04:11:39