从具有成员函数的共享指针的std ::向量中remove_if
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
。
我正在使用MSVC2013。
即使向量不存储指针,这也可能无法工作,因为成员函数以 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()
);
替代方案,如果您没有lambdas:
//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());
我一直在尝试使用
remove_if
,但是Predicate
使用对象的数据成员,而不是指针。
什么指针?您将需要使用lambda,因为不支持通过会员函数指针:
ptiles.erase(std::remove_if(ptiles.begin(), ptiles.end(), [](const auto& value) {
return value->hasNoRegions();
}), ptiles.end());
适当的注意,MSVC 2013的现代C 支持差,因此您可能需要编写函数而不是lambda,或者在lambda中不使用auto
。
相关文章:
- 写入向量<向量<bool>>
- 函数向量_指针有不同的原型,我可以构建一个吗
- std::向量与传递值的动态数组
- 将值指定给向量(2D)的向量中的某个位置
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 如何使用向量的template_back函数
- 尝试通过多个向量访问变量时,向量下标超出范围
- 如何通过派生类函数更改基类中的向量
- C++从另一个类访问公共静态向量的正确方法是什么
- 如何将ampl中的集合表示为c++中的向量
- 变量没有改变?通过向量的函数调用
- 迭代时从向量和内存中删除对象
- 使用函数"remove"删除重复元素
- 向量 <int> a {N, 0} 和 int arr a[N] = {0} 的时间复杂度有什么区别
- 如何为模板化对象创建模板向量?VS正在投掷C3203
- 计算排序向量的向量中唯一值的计数
- 矩阵向量乘法(cublasDgemv)返回零
- 一对向量构造函数:初始值设定项列表与显式构造
- 在不同类型的向量上使用 std::remove 的不同结果
- vector.erase 和 std::remove 在自定义向量上