Вы можете использовать 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 Lambda в то же самое, конечно.
также может заменить 'if (...)' на 'while (...)', пока условие может также указывать, когда оно заканчивается концом вектора. – goldPseudo
Я не совсем понимаю решение GMan, поэтому я принимаю это h ack версия. – user198729
@user: вы должны попросить разъяснения и/или получить [книгу] (http://stackoverflow.com/questions/388242/the-definitive-c++-book-guide-and-list), чтобы научить вас C++. – GManNickG