gpt4 book ai didi

c++ - 从 std::vector 中删除动态分配的对象

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:56:54 25 4
gpt4 key购买 nike

这是正确的吗?

std::vector<Enemy*> enemies;
enemies.push_back(new Enemy());

Enemy* enemy = enemies[0];
enemies.erase(enemies.begin() + 0);
delete enemy;

最佳答案

是的,它确实有效,但这不是理想的方法。

首先,添加 0 只是噪音,您可以将其删除。但更好的是,只需使用 pop_front()。此外,无需中间步骤,您可以在删除之前删除。

但是 std::vector 不如从前面弹出那么好,尤其是当它很大时(因为需要移动剩余的元素来填充空白)。如果不需要连续内存,请改用 std::deque。或者,如果顺序无关紧要,您可以使用如下内容:

template <typename T, typename A>
void unordered_pop_front(std::vector<T, A>& vec)
{
using std::swap;
swap(vec.front(), vec.back()); // constant time

vec.pop_back(); // constant time
}

它将前元素与后元素交换,然后将其弹出。当然,不会保留顺序。

另一个问题是您的内存管理方法。任何时候你有明确的清理代码,你就做错了什么。应该是done automatically .

使用 Boost's ptr_vector ,或 smart pointersstd::vector . (注意:不要在容器中使用 std::auto_ptr,它在这方面是错误的。)对于快速智能指针建议,使用 std::unique_ptr(如果你的编译器支持 C++0x),或者 std::/boost::shared_ptr

关于c++ - 从 std::vector 中删除动态分配的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5445492/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com