Вы можете использовать std::remove_if
. Это переместит все оставшиеся элементы на передний план и вернет итератор на новый задний план. Затем вы можете стереть его:
struct my_predicate
{
bool operator()(HANDLE) const
{
return ...;
}
};
typedef std::vector<HANDLE> vector_type;
vector_type::iterator newEnd =
std::remove_if(myvector.begin(), myvector.end(), my_predicate());
myvector.erase(newEnd, myvector.end());
Обычно это делается в одну строку. Если ваш компилятор поддерживает лямбда (C ++ 0x), вы можете сделать:
vector_type::iterator newEnd =
std::remove_if(myvector.begin(), myvector.end(), [](HANDLE){ return ... });
myvector.erase(newEnd, myvector.end());
Чтобы сохранить предикат локальным.
Если вы думаете, что это безобразно, просто оберните это:
template <typename Vec, typename Pred>
Pred erase_if(Vec& pVec, Pred pPred)
{
pVec.erase(std::remove_if(pVec.begin(), pVec.end(),
pPred), pVec.end());
return pPred;
}
Тогда:
erase_if(myvector, mypredicate);
C ++ 0x лямбда-работа, конечно, такая же.