我有一个对象的矢量(顺序很重要)(让我们称之为myobj类),我试图一次删除多个对象。
class vectorList
{
vector<*myobj> myList;
};
class myobj
{
char* myName;
int index;
bool m_bMarkedDelete;
}
我认为最好的方法是将特定的myobj对象标记为删除,然后在向量上调用myList.remove_if()。但是,我不确定如何使用谓词等。我应该在对象中创建一个成员变量,它允许我说我要删除myobj,然后创建一个谓词来检查成员变量是否已设置?
如何将谓词实现为vectorList类的一部分?
答案 0 :(得分:41)
我应该在对象中创建一个允许我说的成员变量 我想删除myobj,然后创建一个谓词 检查成员变量是否已设置?
你还没有这样做过吗?这不是m_bMarkedDelete
的用途吗?您可以像这样编写谓词:
bool IsMarkedToDelete(const myobj & o)
{
return o.m_bMarkedDelete;
}
然后:
myList.erase(
std::remove_if(myList.begin(), myList.end(), IsMarkedToDelete),
myList.end());
或者,使用lambdas:
myList.erase(
std::remove_if(myList.begin(), myList.end(),
[](const myobj & o) { return o.m_bMarkedDelete; }),
myList.end());
如果你的班级实际上没有那个成员,并且你问我们是否应该,那么我会说不。您使用什么标准来决定是否将其标记为删除?在谓词中使用相同的条件,例如:
bool IndexGreaterThanTen(const myobj & o)
{
return o.index > 10;
}
note - 我写的函数当然是无效的,因为你的所有成员都是私有的。所以你需要一些方法来访问它们。
答案 1 :(得分:10)
谓词基本上是条件比较。它可以是一个功能或对象。这是使用新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());
编辑:对于指针,假设您有一个矢量或接口,您可以将它们设置为nullptr
,然后使用几乎相同的代码批量删除它们。在VS2008中,你不会有lambda,所以改为生成比较谓词函数或结构。
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());