从weak_ptrs列表中删除项目

use*_*280 9 c++ pointers

我有一个weak_ptrs列表,我用它来跟踪对象.在某个时刻,我想从给定shared_ptr或weak_ptr的列表中删除一个项目.

#include <list>

int main()
{
typedef std::list< std::weak_ptr<int> > intList;

std::shared_ptr<int> sp(new int(5));
std::weak_ptr<int> wp(sp);

intList myList;
myList.push_back(sp);

//myList.remove(sp);
//myList.remove(wp);
}
Run Code Online (Sandbox Code Playgroud)

但是,当我取消注释上述行时,程序将无法构建:

1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\list(1194): error C2678: binary '==' : no operator found which takes a left-hand operand of type 'std::tr1::weak_ptr<_Ty>' (or there is no acceptable conversion)
Run Code Online (Sandbox Code Playgroud)

如何在给定shared_ptr或weak_ptr的情况下从列表中删除项目?

mka*_*aes 7

弱指针没有operator ==.您可以比较weak_ptrs指向的shared_ptrs.
就像这样.

myList.remove_if([wp](std::weak_ptr<int> p){
    std::shared_ptr<int> swp = wp.lock();
    std::shared_ptr<int> sp = p.lock();
    if(swp && sp)
        return swp == sp;
    return false;
});
Run Code Online (Sandbox Code Playgroud)

  • 但是,有一个`owner_before`,它实现了一个部分顺序.所以你也可以把lambda写成`[wp](std :: weak_ptr <int> p){return!(p.owner_before(wp)|| wp. owner_before(p));` - 不需要锁定.另外,在你的代码中,我认为你错过了`swp == sp == 0`案例. (3认同)