Jor*_*dan 31 c++ stl predicate vector
我有一个对象的矢量(顺序很重要)(让我们称之为myobj类),我试图一次删除多个对象.
class vectorList
{
vector<*myobj> myList;
};
class myobj
{
char* myName;
int index;
bool m_bMarkedDelete;
}
Run Code Online (Sandbox Code Playgroud)
我认为最好的方法是将特定的myobj对象标记为删除,然后在向量上调用myList.remove_if().但是,我不确定如何使用谓词等.我应该在对象中创建一个成员变量,它允许我说我要删除myobj然后创建一个谓词来检查成员变量是否已设置?
如何将谓词实现为vectorList类的一部分?
Ben*_*ley 45
我应该在对象中创建一个成员变量,它允许我说我要删除myobj然后创建一个谓词来检查成员变量是否已设置?
你还没有这样做过吗?这不是为了什么m_bMarkedDelete?你会像这样编写谓词:
bool IsMarkedToDelete(const myobj & o)
{
return o.m_bMarkedDelete;
}
Run Code Online (Sandbox Code Playgroud)
然后:
myList.erase(
std::remove_if(myList.begin(), myList.end(), IsMarkedToDelete),
myList.end());
Run Code Online (Sandbox Code Playgroud)
或者,使用lambdas:
myList.erase(
std::remove_if(myList.begin(), myList.end(),
[](const myobj & o) { return o.m_bMarkedDelete; }),
myList.end());
Run Code Online (Sandbox Code Playgroud)
如果你的班级实际上没有那个成员,并且你问我们是否应该,那么我会说不.您使用什么标准来决定是否将其标记为删除?在谓词中使用相同的条件,例如:
bool IndexGreaterThanTen(const myobj & o)
{
return o.index > 10;
}
Run Code Online (Sandbox Code Playgroud)
注意 - 我写的函数当然是无效的,因为你的所有成员都是私有的.所以你需要一些方法来访问它们.
AJG*_*G85 11
谓词基本上是条件比较.它可以是一个功能或对象.这是使用新C++ lambda的示例.此代码将遍历向量并删除等于3的值.
int arg[6] = {1, 2, 3, 3, 3, 5};
std::vector<int> vec(arg, arg+6);
vec.erase(
std::remove_if(
vec.begin(), vec.end(),
[](int i){ return i == 3;}),
vec.end());
Run Code Online (Sandbox Code Playgroud)
编辑:对于指针,假设你有一个矢量或接口你可以设置它们nullptr然后批量删除它们几乎相同的代码.在VS2008中你不会有lambdas所以请改为使用比较谓词函数或结构.
bool ShouldDelete(IAbstractBase* i)
{
return i == nullptr;
// you can put whatever you want here like:
// return i->m_bMarkedDelete;
}
std::vector<IAbstractBase*> vec;
vec.erase(
std::remove_if(
vec.begin(), vec.end(),
ShouldDelete),
vec.end());
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
66156 次 |
| 最近记录: |