如果我有vector<weak_ptr<Type>>
,我就无法使用vector::erase(remove())
删除所需的weak_ptr
,因为它没有比较运算符==。
必须将lambda谓词传递给remove_if
中的vector::erase(remove_if())
,比较通过weak_ptr::_Get()
_Get()
以下划线和大写字母开头,意味着它是为实施而保留的,并不意味着用户可以访问。
很明显,weak_ptr
并不是以这种方式存储,而是为什么?
我在考虑使用vector<weak_ptr<>>
来保存weak_ptr
个子类只有一些我在经理类中的对象需要进一步处理因此,通过lock()
确保它们没有在管理类中删除(在多线程应用程序中)。
管理员警告子类创建和删除对象,使vector<weak_ptr<>>
保持最新。
答案 0 :(得分:0)
您可以将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";
}
}
}