我想从向量中删除一些迭代器,所以这就是我现在所拥有的。
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;
}
显然,当迭代器被删除时,这个代码给了我一个错误,它是向量中的最后一个,否则看起来它工作正常。我知道在这样的循环中修改向量可能不是理想的行为,但如果我必须这样做,那么最好的方法是什么?
感谢。
答案 0 :(得分:5)
for (it = vector.begin(); it != vector.end(); )
{
if (it->value == 1)
it = vector.erase(it);
else
++it;
}
但是对于这种情况,你实际上应该只使用std::remove_if
和适当的谓词。
答案 1 :(得分:4)
另一种方法:
vector.erase( std::remove_if( vector.begin(), vector.end(), boost::bind( &class::value, _1 ) == 1 ), vector.end() );
boost::bind
如果可用,可能会被std::bind
替换。
答案 2 :(得分:-1)
在向量上迭代时从向量中删除是个坏主意。只需过滤它。
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;
}