【问题标题】:Remove element from vector using 'this' keyword使用“this”关键字从向量中删除元素
【发布时间】:2015-01-26 08:39:44
【问题描述】:

相当简单的问题。

我有一个 Bullet 对象,当子弹与对象发生碰撞时,它会被销毁并从 Bullets 向量中移除。

每个 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(),同样的错误。

【问题讨论】:

  • Bullet 类是否有相等运算符(即operator==)?
  • 错误信息再清楚不过了。而std::remove 确实遍历了向量,所以要注意这种方法无论如何都有线性成本。
  • 我没有,但我真的可以使用解决方案。我在这里看到了其他不需要实现 operator== 的示例,但他们仍然使用这种方法。老实说,我该如何从向量中删除一个元素(this)?
  • 您应该实现 operator== 或尝试使用 std::remove_if 和 lambda 进行比较。例如:stackoverflow.com/questions/24086717/…
  • @JoeBid 这些示例使用了一个向量,该向量具有相等运算符(整数、指针、std::strings...)。没有办法绕过这个要求。

标签: c++ vector erase


【解决方案1】:

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

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

【讨论】:

【解决方案2】:

试试这个:

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

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-02
      • 1970-01-01
      相关资源
      最近更新 更多