我在寻找一种方法来删除指针向量中的值时遇到了麻烦。
我有一个向量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)
非常感谢您!
答案 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;} ) );
}