2011-10-31 70 views
24

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

class vectorList 
{ 

    vector<*myobj> myList; 
}; 

class myobj 
{ 

    char* myName; 
    int index; 
    bool m_bMarkedDelete; 
} 

我在想,最好的办法做到这一点会在标示为删除特定MyObj中的对象,然后对向量调用myList.remove_if()。但是,我并不确定如何使用谓词等。我应该在对象中创建一个成员变量,它允许我说我想删除myobj,然后创建一个谓词来检查是否设置了成员变量?

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

+1

它可能不相关,但std :: list保留顺序并具有自己的remove_if函数,该函数速度更快且不需要单独的擦除。 – Ant

+0

@Ant:'list :: remove_if'比在矢量上移除和擦除更快吗?在什么情况下?在我做过的许多合理测试中,情况并非如此。不要以为擦除是一个恒定的列表操作,它会更快。 'std :: vector'的连续性和随机访问保证让它获得了很多性能。 –

回答

34

我应该创造一种让我说 ,我要删除MyObj中,然后创建一个谓语,看看成员变量设置该 检查对象的成员变量?

你不是已经做到了吗?这不是m_bMarkedDelete的用途吗?你会写这样的断言:

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

然后:

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

或者,使用lambda表达式:

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; 
} 

- 我写的功能当然是无效的,因为所有的成员都是私有的。所以你需要一些方法来访问它们。

+0

我得到以下错误,因为它是一个指针: 错误C2662:'myobj :: IsMarkedToDelete':无法将'this'指针从'const myobj'转换为'myobj&。我将它标记为删除,因为我正在从具有与我的矢量同步的网格的类中进行删除。我必须删除网格中的行,然后删除向量中相应的选定行。 – Jordan

+0

@Jordan:它不应该是一个成员,它应该是一个免费的功能。 –

+0

IsMarkedToDelete应该是一个免费的功能?看起来问题在于对象的“常量”,尽管...... – Jordan

8

谓词基本上是条件比较。它可以是一个功能或对象。以下是使用新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()); 
+0

如果vector是myobj *指针列表,我该怎么做?这是我感到困惑的事情之一。这将在VS 2008中工作吗?谢谢! – Jordan