4

私は共有ポインタのセットを持っています:

std::set<boost::shared_ptr<T>> set;

そしてポインタ:

T* p;

に等しい要素を効率的に削除したいのですが、はとはまったく異なるタイプであるため、セットのメンバーや標準アルゴリズムのいずれでもこれを行うことはできません。setpT*boost::shared_ptr<T>

私が考えることができるいくつかのアプローチは次のとおりです。

  • どういうわけか、ポイントされたメモリの所有権を取得しないポインタから新しいshared_ptrを構築します(理想的な解決策ですが、これを行う方法がわかりません)
  • 上記を実行できるように、shared_ptrをラッピング/再実装します
  • セットに対して独自のバイナリ検索を実行するだけです
4

3 に答える 3

9

shared_ptr<T>aをT使用して aを構築しますnull_deleter( boost:::shared_ptr FAQを参照)。

struct null_deleter {
    void operator()(void const *) const { }
};

size_t remove_ptr_from_set(std::set<boost::shared_ptr<T>> &set, X* x)
{
    shared_ptr<X> px(x, null_deleter());
    return set.erase(px);
}

そうすれば、タイプは互換性があり、一時的な shared_ptr がオブジェクトを削除することを心配する必要はありません。

または、コメントの 1 つが言うように、T をenable_shared_from_thisから継承するように変更できれば、オブジェクトから正しい共有 ptr を取得できます。

于 2010-03-28T11:20:36.350 に答える
1

セットを使用する理由がタイプTのポインターを効率的に見つける必要があるということである場合、明白な答えはそれを共有ポインターのセットにすることではありません!代わりに、セットに含まれるポインターの存続期間を管理するクラスでセットをラップします。

于 2010-03-28T11:00:21.377 に答える
1

boost::ptr_setセットにオブジェクトの所有権を持たせたいboost::reference_wrapper場合、またはセットにそれらへの参照を格納したい場合に使用できます。shared_ptrコードの 1 か所で使用する場合、すべての場所で使用する必要があります。そうしないと、ひどいクラッシュ (ダングリング ポインター、既に削除されたオブジェクトなど) が発生する危険があります。例外は、 によって保持されているが所有権を共有していないweak_ptrオブジェクトを指すポインターです。shared_ptr

于 2010-03-28T11:09:44.207 に答える