Если вы хотите искать линейно по вектору, тогда
seq.erase( std::find( seq.begin(), seq.end(), elt ));
Если у вас есть предикат и вы хотите удалить все элементы, соответствующие предикату, тогда:
seq.erase( std::remove_if( seq.begin(), seq.end(), Pred ), seq.end());
Ни один из этих методов не является наиболее эффективным, потому что они требуют линейного поиска, и даже если ваш элемент будет найден на ранней стадии, стирание обходится дорого, потому что оно должно перемещать все остальные элементы на позицию, чтобы они оставались непрерывными.
Использование std::list решит последнюю из них: поиск будет линейным, но стирание будет постоянным временем.
Если возможно хранить ваши элементы в ассоциативном контейнере, который использует поиск по ключу, тогда это будет более эффективно: поиск O (log N) и удаление за постоянное время.
Хэш-карта может быть даже лучше, близка к постоянному поиску и удалению времени.
Для того, что вы предлагаете, т.е. стирания указателем объекта, вы можете использовать std::set для своего типа T. Затем используйте mySet.erase( pt );
, где pt - ваш указатель. Конечно, вам нужно управлять временем жизни ваших указателей, но тот факт, что вы знаете, какой из них стереть из своей коллекции, предполагает, что у вас есть его копия в другом месте.
Вы можете использовать std::set, SharedPtrLess >
где вы определяете SharedPtrLess следующим образом:
template< typename T >
struct SharedPtrLess
{
bool operator()( boost::shared_ptr<T> left, boost::shared_ptr<T> right ) const
{
return std::less<T>()( left.get(), right.get());
}
};
person
CashCow
schedule
22.11.2010