remove_if 来自 std::vector 个具有成员函数的共享指针
remove_if from a std::vector of shared pointers with a member function
如何删除 std::vector<std::shared_ptr<PTile>> ptiles
中满足条件 ptile->hasNoRegions()
的元素?我一直在尝试为此使用 remove_if
,但是 Predicate
使用对象的数据成员,而不是指针。如果元素是指向对象的智能指针,如何将谓词设置为函数?
我现在有什么
ptiles.erase(std::remove_if(ptiles.begin(), ptiles.end(), &PTile::hasNoRegions), ptiles.end());
其中 hasNoRegions
是 PTile
的成员函数。这显然不起作用,因为我有 std::shared_ptr<PTile>
,而不是 PTile
。
我正在使用 MSVC 2013。
即使向量不存储指针,这也可能不起作用,因为成员函数将 this
作为隐式参数,并且代码不会生成。
您需要编写一个显式处理 std::shared_ptr
.
的仿函数或 lambda
ptiles.erase(
std::remove_if(ptiles.begin(), ptiles.end(), [](std::shared_ptr<PTile> const& ptr) {
return ptr->hasNoRegions();
}),
ptiles.end()
);
替代方案,如果您没有 lambda:
//Outside method
bool should_remove_ptile(std::shared_ptr<PTile> const& ptr) {
return ptr->hasNoRegions();
}
//inside method
ptiles.erase(std::remove_if(ptiles.begin(), ptiles.end(), should_remove_ptile), ptiles.end());
I've been trying to use remove_if
for this, but the Predicate
uses a data member of the object, not the pointer.
什么指针?您将需要使用 lambda,因为不支持传递成员函数指针:
ptiles.erase(std::remove_if(ptiles.begin(), ptiles.end(), [](const auto& value) {
return value->hasNoRegions();
}), ptiles.end());
请注意,MSVC 2013 对现代 C++ 的支持很差,因此您可能需要编写仿函数而不是 lambda,或者不要在 lambda 中使用 auto
。
如何删除 std::vector<std::shared_ptr<PTile>> ptiles
中满足条件 ptile->hasNoRegions()
的元素?我一直在尝试为此使用 remove_if
,但是 Predicate
使用对象的数据成员,而不是指针。如果元素是指向对象的智能指针,如何将谓词设置为函数?
我现在有什么
ptiles.erase(std::remove_if(ptiles.begin(), ptiles.end(), &PTile::hasNoRegions), ptiles.end());
其中 hasNoRegions
是 PTile
的成员函数。这显然不起作用,因为我有 std::shared_ptr<PTile>
,而不是 PTile
。
我正在使用 MSVC 2013。
即使向量不存储指针,这也可能不起作用,因为成员函数将 this
作为隐式参数,并且代码不会生成。
您需要编写一个显式处理 std::shared_ptr
.
ptiles.erase(
std::remove_if(ptiles.begin(), ptiles.end(), [](std::shared_ptr<PTile> const& ptr) {
return ptr->hasNoRegions();
}),
ptiles.end()
);
替代方案,如果您没有 lambda:
//Outside method
bool should_remove_ptile(std::shared_ptr<PTile> const& ptr) {
return ptr->hasNoRegions();
}
//inside method
ptiles.erase(std::remove_if(ptiles.begin(), ptiles.end(), should_remove_ptile), ptiles.end());
I've been trying to use
remove_if
for this, but thePredicate
uses a data member of the object, not the pointer.
什么指针?您将需要使用 lambda,因为不支持传递成员函数指针:
ptiles.erase(std::remove_if(ptiles.begin(), ptiles.end(), [](const auto& value) {
return value->hasNoRegions();
}), ptiles.end());
请注意,MSVC 2013 对现代 C++ 的支持很差,因此您可能需要编写仿函数而不是 lambda,或者不要在 lambda 中使用 auto
。