C++ C++;移除对象向量上的_

C++ C++;移除对象向量上的_,c++,vector,stl,predicate,C++,Vector,Stl,Predicate,我有一个对象的向量(顺序很重要)(让我们称它们为myobj类),我试图一次删除多个对象 class vectorList { vector<*myobj> myList; }; class myobj { char* myName; int index; bool m_bMarkedDelete; } 类向量列表 { 矢量糜棱岩; }; myobj类 { char*myName; 整数指数; 布尔·穆布马克德莱特; } 我在想,最好的方法是

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

class vectorList
{

    vector<*myobj> myList; 
};

class myobj
{

    char* myName;
    int index;
    bool m_bMarkedDelete;
}
类向量列表
{
矢量糜棱岩;
};
myobj类
{
char*myName;
整数指数;
布尔·穆布马克德莱特;
}
我在想,最好的方法是标记特定的myobj对象进行删除,然后在向量上调用myList.remove_if()。但是,我不确定如何使用谓词之类的。我是否应该在对象中创建一个成员变量,允许我说我要删除myobj,然后创建一个谓词来检查是否设置了成员变量


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

谓词基本上是一种条件比较。它可以是函数或对象。下面是一个使用新C++ LAMBDAS的例子。此代码将遍历向量并删除等于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());
我应该在对象中创建一个成员变量吗 我想删除myobj,然后创建一个谓词 检查是否设置了成员变量

你不是已经做了吗?这难道不是《代码》的目的吗?您可以这样编写谓词:

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

或者,使用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;
}

注意——我编写的函数当然是无效的,因为您的所有成员都是私有的。因此,您需要某种方法来访问它们。

如果向量是myobj*指针的列表,我该怎么做?这是我感到困惑的事情之一。这在VS 2008中有效吗?谢谢我得到以下错误,因为它是一个指针:错误C2662:“myobj::IsMarkedToDelete”:无法将“this”指针从“const myobj”转换为“myobj&”。我把它标记为删除,因为我是从一个类中做的,这个类有一个与我的向量同步的网格。我必须删除网格中的行,然后删除向量中相应的选定行。@Jordan:它不应该是成员,它应该是自由函数。IsMarkedToDelete应该是自由函数吗?问题似乎在于物体的“常数”…@Jordan:这是关于
这个
指针。此
指针不应存在
,因为此函数不应该是成员。IsMarkedToDelete应该是静态函数,它可能不相关,但std::list保留顺序,并有自己的remove\u if函数,该函数速度快得多,不需要单独擦除。@Ant:
list::remove\u if
比向量上的remove and erase快吗?在什么情况下?在我做过的许多合理的测试中,情况肯定不是这样。不要仅仅因为擦除是列表的一个固定时间操作,就认为它会更快。
std::vector
的连续性和随机访问保证为它购买了大量的性能。
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;
}