私は約10MBのパケットを指し示すポインターのベクトルを持っています。そこでは、最初の2MBから、私は自分の述語と一致するものをすべて削除したいと思っています。ここで問題となるのはremove_if
ですが、私の使用例では不要ですが、ベクトル全体を繰り返し処理します。他の効率的な方法はありますか?上記のコードでC++ remove_if全体のベクトルを反復せずに
fn_del_first_2MB
{
uint32 deletedSoFar = 0;
uint32 deleteLimit = 2000000;
auto it = std::remove_if (cache_vector.begin(), cache_vector.end(),[deleteLimit,&deletedSoFar](const rc_vector& item){
if(item.ptr_rc->ref_count <= 0) {
if (deletedSoFar < deleteLimit) {
deletedSoFar += item.ptr_rc->u16packet_size;
delete(item.ptr_rc->packet);
delete(item.ptr_rc);
return true;
}
else
return false;
}
else
return false;
});
cache_vector.erase(it, cache_vector.end());
}
deletedSoFar
がdeleteLimit
より大きくなると、それ以上の任意の繰り返しは不要です。
代わりに 'cache_vector.end()'独自のマーカーを置くの。さまざまな[std :: remove_if](http://en.cppreference.com/w/cpp/algorithm/remove)オーバーロードがあります。 –
@ RawN ^これは、簡潔なコードサンプルでは適切な答えかもしれません。 –
@πάντεῥεῖ私は*簡潔なコードサンプル*部分が欠けています。私はMeyersの最初の本の半分だけです。 –