C++ remove_if对象的向量

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)

注意 - 我写的函数当然是无效的,因为你的所有成员都是私有的.所以你需要一些方法来访问它们.

  • IsMarkedToDelete 应该是静态函数 (2认同)

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)