【问题标题】:Vector of pointers and erasing a specific value指针矢量和擦除特定价值
【发布时间】:2019-01-14 00:15:12
【问题描述】:

我在寻找从指针向量中擦除值的方法时遇到了一些麻烦。

我有一个向量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;} ) );
} 

但是我的 bool lambda 永远不会返回 true (verified with assert) 。有什么我做错了吗? (我必须说我对 Lambda 函数/tors 不是很熟悉)

非常感谢!

【问题讨论】:

  • 显然,由于 C 是按值传递的,并且您将该对象的地址与 myVect 中的地址进行比较,它基本上永远不会匹配。也许,您想比较项目值,或者您可能想将指针传递给您的删除函数。
  • 试试C == *W作为测试

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


【解决方案1】:

您的函数接受 MyClass 作为 C 的值,因此它始终在函数的本地范围内使用新创建的实例。

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

如果您真的希望通过地址进行测试,您可能希望通过引用接受您的参数,void remove(MyClass& C) 在这种情况下,您的代码的某些其他部分可以通过引用传递现有对象,其指针可能在 @ 987654328@.

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

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

【讨论】:

  • 谢谢,这就是我要做的。我很快就想到了这一点,但是我的课程的制作方式(扑克桌周围的玩家)我必须为我的“玩家”课程添加一个唯一的 ID,以便我可以比较它们,我想避免这样做(因为我可能有很多同名的球员,所以我不能这样比较)。我想我必须这样做!
猜你喜欢
  • 2012-06-19
  • 1970-01-01
  • 2019-05-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-08
  • 1970-01-01
相关资源
最近更新 更多