![](/img/trans.png)
[英]Random access iterators - does vector.end() - vector.begin() = vector.size() in C++;
[英]c++ erase the std::vector.end() while looping over all iterators
我想從向量中刪除一些迭代器,所以這就是我現在所擁有的。
void function(std::vector <class*> & vector)
{
std::vector <class*>::iterator it;
for(it = vector.begin(); iter != vector.end(); ++iter)
{
if(it->value == 1)
vector.erase(it);
}
Display(vector);
return;
}
顯然,當迭代器被移除時,這個代碼給了我一個錯誤,它是向量中的最后一個,否則看起來它工作正常。 我知道在這樣的循環中修改向量可能不是理想的行為,但如果我必須這樣做,那么最好的方法是什么?
謝謝。
for (it = vector.begin(); it != vector.end(); )
{
if (it->value == 1)
it = vector.erase(it);
else
++it;
}
但是對於這種情況,您實際上應該使用std::remove_if
和適當的謂詞。
另一種方法:
vector.erase( std::remove_if( vector.begin(), vector.end(), boost::bind( &class::value, _1 ) == 1 ), vector.end() );
如果可用的話, boost::bind
可能會被std::bind
取代。
在向量上迭代時從矢量中刪除是個壞主意。 只需過濾它。
void function(std::vector <class*> & vector)
{
std::vector <class*>::iterator from= vector.begin();
std::vector <class*>::iterator to= from;
for(; from != vector.end(); ++from)
{
if((*from)->value == 1) continue;
// it should be (*from) or use boost::ptr_vector
*(to++)=*from;
}
vector.erase( to, vector.end() );
Display(vector);
return;
}
這個功能與Ylisar的代碼完全相同。 恕我直言這是最好的矢量,如果你總是有東西要刪除,但如果刪除是非常罕見的(對於整個一個矢量),使用本傑明林德利版本。
無論優化是什么,只有在您有要刪除的內容時才可以過濾:
void function(std::vector <class*> & vector)
{
std::vector <class*>::iterator to= vector.begin();
for(; to != vector.end(); ++to)
{
if((*to)->value == 1)
{
std::vector <class*>::iterator from=to;
for(++from; from != vector.end(); ++from)
{
if((*from)->value == 1) continue;
*(to++)=*from;
}
vector.erase( to, vector.end() );
break;
}
}
Display(vector);
return;
}
如果您不需要保留訂單,則可以從最小版本過熱復制到最小版本過熱:
void function(std::vector <class*> & vector)
{
std::vector <class*>::iterator to= vector.begin();
std::vector <class*>::iterator from=vector.end();
if(to == from) return;
for(;;)
{
if((*to)->value == 1) // need skip value from begin
{
for( --from; from != to; --from)
{
if((*from)->value == 1) continue; // need skip value from end
*to=*from;
++to; // copied, move to next
}
}
else
{
++to; //preserved, move to next
}
if(to == from)
{
vector.erase( to, vector.end() );
break;
}
}
Display(vector);
return;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.