指针向量和擦除特定值

时间:2018-08-07 01:52:49

标签: c++ c++11 pointers vector

我在寻找一种方法来删除指针向量中的值时遇到了麻烦。

我有一个向量std::vect<MyClass*> myVect,其中包含按特定顺序指向对象o1, o2,...的指针。我在查找如何删除一个特定对象(例如o1

)的条目时遇到了麻烦

我尝试了

void remove(MyClass C)
{
    myVect.erase( std::find_if( myVect.begin(), myVect.end(), [&](MyClass* W) 
   {return &C == W;} ) );
} 

但是我的布尔lambda永远不会返回true(已通过assert验证)。我做错什么了吗? (我必须说,我不太熟悉Lambda函数/ tor)

非常感谢您!

1 个答案:

答案 0 :(得分:3)

您的函数按值接受MyClass作为C,因此它始终与函数本地作用域中的新实例一起工作。

您的测试函数正在检查&C == W;,但是C的地址不可能与存储在vector中的地址匹配(除非remove之前添加了它)。

如果您确实希望通过地址进行测试,则可能希望通过引用接受参数void remove(MyClass& C),在这种情况下,代码的其他部分可能会通过引用传递现有对象,而该对象的指针可能位于vector

您更有可能希望按值进行测试,在这种情况下,为了提高效率,您可能希望代码如下:

void remove(const MyClass& C)  // Receive by const reference to avoid pointless copy
{
    // Testing C == *W tests the value pointed to, not the pointers themselves
    myVect.erase( std::find_if( myVect.begin(), myVect.end(), [&](MyClass* W) 
   {return C == *W;} ) );
 }