ベクトルを反復しながらベクトルから消去するのは悪い考えです。濾すだけです。
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 によるコードとまったく同じ機能です。IMHOこれは、常に何かを削除する場合はベクターに最適ですが、削除が非常にまれな場合(1つのベクター全体に対して)、Benjamin Lindleyバージョンを使用してください。
最適化が何であれ、消去するものがある場合にのみフィルタリングできます。
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;
}