gpt4 book ai didi

c++ - 如何在带有 std::tr1::weak_ptr 的容器上使用 std::remove?

转载 作者:太空狗 更新时间:2023-10-29 20:49:10 24 4
gpt4 key购买 nike

如果我有一个 STL 容器,说出一个指针列表,我可以像下面的例子那样删除它们。对于 weak_ptr 的容器,这是行不通的,因为它们无法进行比较,因为它们需要先被锁定。我能做什么?

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

最佳答案

一方面,您可以只为任何 weak_ptr 定义运算符 ==。我敢肯定这没有实现是有原因的,它可能会在以后影响到你。

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

... 然后您就可以像往常一样调用 remove() 了。我猜这有点极端。

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

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

然后像这样使用它:

mylist.remove_if(EqPredicate(pItem));

看起来代码比较多,但是可以压缩EqPredicate类,大部分是空心的。此外,还可以将其制作成模板,以便将其与包含 Item 以外类型的列表一起使用。

哦,请务必在任何地方通过引用传递给您 weak_ptrs,包括您的比较函数。

*bind 在性能方面不是免费的。如果您期望有很多 Remove() 调用并且非常关心性能,那么最好避免它。

关于c++ - 如何在带有 std::tr1::weak_ptr 的容器上使用 std::remove?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1390340/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com