gpt4 book ai didi

c++ - 为什么 weak_ptr 没有比较运算符==?

转载 作者:太空狗 更新时间:2023-10-29 23:11:33 26 4
gpt4 key购买 nike

如果我有一个 vector<weak_ptr<Type>> ,我不能使用 vector::erase(remove())删除所需的 weak_ptr , 因为它没有比较运算符==。

必须将 lambda 谓词传递给 remove_ifvector::erase(remove_if())比较通过 weak_ptr::_Get() 访问的底层原始指针

_Get()以一个下划线和一个大写字母开头,这意味着它是为实现而保留的,不打算被用户访问。

很明显weak_ptr s 不应该以这种方式存储,但为什么呢?


我正在考虑使用 vector<weak_ptr<>>持有weak_ptr s 在一个子类中,只有一些 我在管理器类中拥有的对象需要进一步处理,从而保证,通过 lock() ing,它们没有在管理类中被删除(在多线程应用程序中)。

管理器提醒子类创建和删除对象,保持vector<weak_ptr<>>最新的。

最佳答案

您可以将 erase-remove 习语与显式谓词一起使用。

例如:

#include <functional>
#include <iostream>
#include <memory>
#include <vector>

using std::cout;
using std::make_shared;
using std::remove_if;
using std::vector;
using std::weak_ptr;

int main()
{
auto p7 = make_shared<int>(7);
auto p8 = make_shared<int>(8);
auto p10 = make_shared<int>(10);
auto p11 = make_shared<int>(11);

vector<weak_ptr<int>> v;

v.push_back(p7);
v.push_back(p8);

{
auto p9 = make_shared<int>(9);
v.push_back(p9);
// p9 dtor'd here
}

v.push_back(p10);
v.push_back(p11);
p8.reset(new int{18}); // old p8 dtor'd here
p10 = make_shared<int>(110); // old p10 dtor'd here

// Only 7 and 11 left.

v.erase(remove_if(v.begin(), v.end(), [](auto w){ if (auto spt = w.lock()) return false; else return true; }), v.end() );
for (auto w : v)
{
cout << "Value is ";
if (auto s = w.lock())
{
cout << *s << "\n";
}
else
{
cout << "MISSING!\n";
}
}
}

关于c++ - 为什么 weak_ptr 没有比较运算符==?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49807734/

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