2012-04-12 191 views
7

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

#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); 
} 

然而,当我去掉上面的线,该程序将无法建立:

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) 

如何从给定的一个shared_ptr或weak_ptr的列表中删除一个项目?

回答

6

弱指针没有运算符==。你可以比较你的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; 
}); 
+2

有一个'owner_before',虽然,它实现了部分order.So你也可以写lambda作为'[WP](STD :: weak_ptr的 P){返回!(p.owner_before(WP) || wp.owner_before(p));' - 不需要锁。另外,在你的代码中,我想你错过了'swp == sp == 0'的情况。 – MSalters 2012-04-12 10:31:43

+0

有没有办法做到这一点没有拉姆达?我会在很多不同的地方移除物品。我看到remove_if谓词是在每个元素上单独调用的,但我需要像上面那样比较2个指针。 – user987280 2012-04-12 21:26:19

+0

@ user987280当然,您可以使用函数或自由函数来代替lambda。但是谓词被称为每个元素的问题究竟是什么? – mkaes 2012-04-13 13:16:15