C++ 使用'从向量中删除元素;这';关键词
这个问题相当简单 我有一个子弹物体,当子弹与物体碰撞时,它会被摧毁,并从子弹向量中移除 每个项目符号对象都有一个对项目符号向量/列表的引用 发生这种情况时,如何在Bullet类中使用this关键字删除它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
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…)。没有办法绕过这个要求,这不安全。向量在擦除时重新分配其内容,因此迭代器无效。这里解释说这不安全。向量在擦除时重新分配其内容,因此迭代器无效。在这里解释