如果我有一个vector<weak_ptr<Type>>
,我不能使用vector::erase(remove())
来删除所需的weak_ptr
,因为它没有比较运算符==。
在比较通过weak_ptr::_Get()
访问的基础原始指针vector::erase(remove_if())
,必须将 lambda 谓词传递给 remove_if
_Get()
以下划线和大写字母开头,表示它是为实现保留的,不应由用户访问。
很明显,weak_ptr
不应该以这种方式存储,但为什么呢?
我正在考虑使用vector<weak_ptr<>>
将weak_ptr
保存在子类中,该子类中只有我在管理器类中拥有的一些需要进一步处理的对象,从而通过lock()
来确保它们尚未在管理类中删除(在多线程应用程序中(。
管理器会提醒子类创建和删除对象,使vector<weak_ptr<>>
保持最新。
您可以将擦除-删除习惯用语与显式谓词一起使用。
例如:
#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";
}
}
}