c++ - 如何动态地从 vector 中删除指向 C++ 中的对象的指针?

标签 c++ pointers dynamic vector element

好吧,所以我正在像一个项目一样做这个游戏,其中我有 3 个不同的对象。

void Character::shoot(){
  Shot* s = new Shot(blablabla);
  shots.push_back(s);
}

这是动态发生的,目前我不删除指针,因此一段时间后它必须是指向该 vector 中的镜头的指针。

我使用机器人、角色和镜头,正如我所说,我需要帮助来动态存储和删除指向镜头的指针,最好是从 vector 中。我已经让它工作了,就像我把所有拍摄的物体放在一个 vector 中一样,但它们永远不会从那里消失。当它们与某些东西碰撞或超出我的屏幕宽度时,我想从我的程序中永久删除它们。

最佳答案

您可以使用std::removestd::erase在任何 std 容器上删除内容:

Shot* to_be_removed = ...;
std::vector<Shot*>::iterator i = std::remove(shots.begin(),shots.end(),to_be_removed);
std::erase(i,shots.end());
delete (to_be_removed);//don't forget to delete the pointer

当您知道要删除的元素时,此方法有效。如果您不知道该元素,则必须找到一种方法来识别要删除的元素。此外,如果您有一个识别元素的系统,那么使用容器迭代器来执行删除可能会更容易:

std::vector<Shot*>::iterator i = ...;//iterator the the element you want to remove
delete (*i);//delete memory
shots.erase(i);//remove it from vector

最后,如果您想从容器中删除所有指针并同时删除所有项目,您可以使用 std::for_each

//c++ 03 standard:
void functor(Shot* s)
{
    delete(s);
}

std::for_each(shots.begin(),shots.end(),functor);
shots.clear();//empty the list

//or c++11 standard:
std::for_each(shots.begin(),shots.end(),[] (Shot * s){ delete(s); } );
//the rest is the same

关于c++ - 如何动态地从 vector 中删除指向 C++ 中的对象的指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21131229/

相关文章:

c++ - 在 Visual Studio 2015 中使用 XP Targeting 编译时 Windows XP 上出现 fatal error

c++ - 游戏中的 Unicode 输入处理

C++ Data-Url as String to const byte *

c - 使用 DMA 打印给定值

c++ - 在字符串正则表达式 C++ 中查找模式

您可以在函数内部取消引用 char 指针吗?

无法连接 strtok 的输出变量。 strcat 和 strtok

c - 如何在 C 中进行 char* 数组元素交换?

C# 4.0 隐式类型动态对象

html - 如何使 div 调整大小以填充整个浏览器窗口?