如何在std :: tr1 :: weak_ptr的容器上使用std :: remove?

nas*_*orn 3 c++ stl tr1

如果我有一个STL容器,说一个指针列表我可以删除它们,如下面的例子.使用weak_ptrs容器时,这不起作用,因为它们无法进行比较,因为它们需要先锁定.我能做什么?

void MyClass::RemoveItem(std::tr1::weak_ptr<Item> const & pItem)
{
    mylist.remove(pItem);
}
Run Code Online (Sandbox Code Playgroud)

sbk*_*sbk 5

首先,您可以为任何weak_ptr定义operator ==.我确定这是没有实施的原因,它可能会在以后咬你.

template <typename T>
bool operator == (const std::tr1::weak_ptr<T>& a, const std::tr1::weak_ptr<T>& b)
{
    return a.lock() == b.lock();
}
Run Code Online (Sandbox Code Playgroud)

...你可以像往常一样调用remove().我猜这有点极端.

如果你坚持使用remove_if()方法,你可以通过使用函数对象摆脱绑定魔术*:

struct EqPredicate
{
    const boost::weak_ptr<Item>& theItem;

    EqPredicate(const boost::weak_ptr<Item>& item) : theItem(item) 
    {
    }

    bool operator () (const boost::weak_ptr<Item>& p) const 
    { 
        return p.lock() == theItem.lock(); 
    }
};
Run Code Online (Sandbox Code Playgroud)

然后像这样使用它:

mylist.remove_if(EqPredicate(pItem));
Run Code Online (Sandbox Code Playgroud)

它看起来像更多的代码,但你可以压缩EqPredicate类,它几乎是空洞的.此外,它可以作为模板使用它与包含除Item之外的类型的列表.

哦,并且通过引用传递给你weak_ptrs包括你的比较函数.

*bind不是免费的性能.如果您期望大量的Remove()调用并且非常关注性能,那么最好避免它.