C++ 使用'从向量中删除元素;这';关键词

C++ 使用'从向量中删除元素;这';关键词,c++,vector,erase,C++,Vector,Erase,这个问题相当简单 我有一个子弹物体,当子弹与物体碰撞时,它会被摧毁,并从子弹向量中移除 每个项目符号对象都有一个对项目符号向量/列表的引用 发生这种情况时,如何在Bullet类中使用this关键字删除它 void collide(){ //error C2678: binary '==': no operator found which takes a left-hand operand of type 'Bullet' //(or there is no acceptable

这个问题相当简单

我有一个子弹物体,当子弹与物体碰撞时,它会被摧毁,并从子弹向量中移除

每个项目符号对象都有一个对项目符号向量/列表的引用

发生这种情况时,如何在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类中实现==运算符。 如果要根据某个项的内存地址删除该项,可以简单地迭代该向量并简单地查找该元素:

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

您需要在bullet类中实现==运算符。 如果要根据某个项的内存地址删除该项,可以简单地迭代该向量并简单地查找该元素:

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

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

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

请注意,这将销毁您当前正在执行其方法的对象,也就是说,您以后无法访问成员的任何对象。

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

bullets->erase(bullets->begin() + (this - &bullets.front()));
请注意,这将销毁您当前正在执行其方法的对象,也就是说,您以后无法访问成员的任何对象。

请尝试以下操作:

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

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

对于
Bullet
类,是否有一个相等运算符(即
运算符==
)?错误消息非常清楚。而且
std::remove
确实会在向量上迭代,所以要注意,不管怎样,这种方法都有线性成本。我没有线性成本,但我真的可以使用解决方案。我在这里看到了其他不需要实现运算符==的示例,但它们仍然使用此方法。老实说,如何从向量中删除元素(this)?您应该实现
操作符==
,或者尝试使用std::remove\if与lambda进行比较。例如:@JoeBid,这些示例使用了具有相等运算符的向量(整数、指针、
std::string
s…)。没有办法绕过这一要求。对于
Bullet
类,您是否有一个相等运算符(即
运算符==
)?错误消息非常清楚。而且
std::remove
确实会在向量上迭代,所以要注意,不管怎样,这种方法都有线性成本。我没有线性成本,但我真的可以使用解决方案。我在这里看到了其他不需要实现运算符==的示例,但它们仍然使用此方法。老实说,如何从向量中删除元素(this)?您应该实现
操作符==
,或者尝试使用std::remove\if与lambda进行比较。例如:@JoeBid,这些示例使用了具有相等运算符的向量(整数、指针、
std::string
s…)。没有办法绕过这个要求,这不安全。向量在擦除时重新分配其内容,因此迭代器无效。这里解释说这不安全。向量在擦除时重新分配其内容,因此迭代器无效。在这里解释