C ++ remove_if对象的向量

时间:2011-10-31 18:49:27

标签: c++ vector stl predicate

我有一个对象的矢量(顺序很重要)(让我们称之为myobj类),我试图一次删除多个对象。

class vectorList
{

    vector<*myobj> myList; 
};

class myobj
{

    char* myName;
    int index;
    bool m_bMarkedDelete;
}

我认为最好的方法是将特定的myobj对象标记为删除,然后在向量上调用myList.remove_if()。但是,我不确定如何使用谓词等。我应该在对象中创建一个成员变量,它允许我说我要删除myobj,然后创建一个谓词来检查成员变量是否已设置?

如何将谓词实现为vectorList类的一部分?

2 个答案:

答案 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());