Что не так с чем-то вроде:
std::vector<double>::iterator iter
= std::find_first_of( current.begin(), current.end(),
to_delete.begin(), to_delete.end() );
while ( iter != current.end() ) {
iter = std::find_first_of( current.erase( iter ), current.end(),
to_delete.begin(), to_delete.end() );
}
Также вы можете определить предикат:
template <typename Container>
class IsElementOf
{
Container const* m_container;
public:
IsElementOf(Container const& container)
: m_container(&container)
{
}
bool operator()( typename Container::value_type const& v ) const
{
return std::find( m_container->begin(),
m_container->end(),
v )
!= m_container->end();
}
};
template <typename Container>
inline IsElementOf<Container>
isElementOf( Container const& container )
{
return IsElementOf<Container>(container);
}
и использовать std :: remove_if:
current.erase(
std::remove_if( current.begin(), current.end(),
isElementOf( to_delete ) ),
current.end() );
(Это действительно только правильное предложение, если вам нужно делать подобные вещи в разных местах. Или если вы можете использовать boost :: bind для генерации IsElementOf, но это сложно, потому что компилятор победил 'Не знаю, с чего начать, когда нужно выяснить тип, поэтому вам придется явно указать его где-нибудь.)