ベクトルを直線的に検索したい場合は、
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)ルックアップと定数時間の削除です。
ハッシュマップはさらに優れている可能性があり、一定時間のルックアップと削除に近い場合があります。
提案していること、つまりオブジェクトのポインターによる消去には、タイプTにstd :: setを使用できます。次に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());
}
};