使用'this'关键字从vector中删除元素

时间:2015-01-26 08:39:45

标签: c++ vector erase

相当简单的问题。

我有一个Bullet对象,当子弹与一个物体碰撞时,它被摧毁并从一个子弹矢量中移除。

每个Bullet对象都有一个对子弹矢量/列表的引用。

如果发生这种情况,如何使用Bullet类中的 this 关键字将其删除?

void collide(){
    //error C2678: binary '==': no operator found which takes a left-hand operand of type 'Bullet'
    //(or there is no acceptable conversion)
    bullets->erase(std::remove(bullets->begin(), bullets->end(), *this), bullets->end());
}

所以是的,代码给了我一个奇怪的错误。 我需要知道如何在不使用while / for循环迭代子弹矢量并且仅使用矢量函数的情况下执行此操作。显然,当前的方法不起作用,因为它在代码中注释了错误。

我也尝试使用find()而不是remove(),同样的错误。

3 个答案:

答案 0 :(得分:2)

您需要在项目符号类中实现==运算符。 如果你想根据它的内存地址删除一个项目,你可以简单地遍历这个向量并找到天真的元素:

    for (Bullet& bullet : bullets){
        if (&bullet == this){
          bullets.erase(bullet);
            break;
         }
     }

答案 1 :(得分:2)

试试这个:

std::remove_if( bullets.begin(), bullets.end(), 
   [this] (const Bullet& s) {
      if (&s == this)
          return true;
      return false;
   }
);

答案 2 :(得分:1)

您需要获取要擦除的对象的迭代器。你可以通过使用第一个和当前对象之间的差异来获得它:

bullets->erase(bullets->begin() + (this - &bullets.front()));

请注意,这将破坏您当前正在执行其方法的对象,即之后您无法访问任何成员的对象。