C++ remove_if on a vector of objects

前端 未结 2 1353
予麋鹿
予麋鹿 2020-12-01 07:50

I have a vector (order is important) of objects (lets call them myobj class) where I\'m trying to delete multiple objects at a time.

class vectorList
{

             


        
相关标签:
2条回答
  • 2020-12-01 08:05

    Should I create a member variable in the object which allows me to say that I want to delete the myobj and then create a predicate which checks to see if the member variable was set?

    Haven't you already done that? Isn't that what m_bMarkedDelete is for? You would write the predicate like this:

    bool IsMarkedToDelete(const myobj & o)
    {
        return o.m_bMarkedDelete;
    }
    

    Then:

    myList.erase(
        std::remove_if(myList.begin(), myList.end(), IsMarkedToDelete),
        myList.end());
    

    Or, using lambdas:

    myList.erase(
        std::remove_if(myList.begin(), myList.end(),
            [](const myobj & o) { return o.m_bMarkedDelete; }),
        myList.end());
    

    If your class doesn't actually have that member, and you're asking us if it should, then I would say no. What criteria did you use to decide to mark it for deletion? Use that same criteria in your predicate, for example:

    bool IndexGreaterThanTen(const myobj & o)
    {
        return o.index > 10;
    }
    

    note -- The functions I've written are of course invalid since all your members are private. So you'll need some way to access them.

    0 讨论(0)
  • 2020-12-01 08:14

    A predicate is basically a conditional comparison. It can be a function or object. Here's an example using new C++ lambdas. This code will go through the vector and remove the values equal to 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());
    

    Edit: For pointers let's say you had a vector or interfaces you could set them to nullptr then remove them in a batch with pretty much the same code. In VS2008 you won't have lambdas so make a comparison predicate function or struct instead.

    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());
    
    0 讨论(0)
提交回复
热议问题