如果你想通过向量线性搜索,那么
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 );
where 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());
}
};