C++ 从std::vector中删除动态分配的对象
这是正确的吗C++ 从std::vector中删除动态分配的对象,c++,vector,C++,Vector,这是正确的吗 std::vector<Enemy*> enemies; enemies.push_back(new Enemy()); Enemy* enemy = enemies[0]; enemies.erase(enemies.begin() + 0); delete enemy; std::向量敌人; 敌人。推回(新敌人); 敌人*敌人=敌人[0]; 敌人。清除(敌人。开始()+0); 删除敌人; 是的,很好。您可以将其简化一点: delete enemies[0]; e
std::vector<Enemy*> enemies;
enemies.push_back(new Enemy());
Enemy* enemy = enemies[0];
enemies.erase(enemies.begin() + 0);
delete enemy;
std::向量敌人;
敌人。推回(新敌人);
敌人*敌人=敌人[0];
敌人。清除(敌人。开始()+0);
删除敌人;
是的,很好。您可以将其简化一点:
delete enemies[0];
enemies.clear();
要删除该元素,还可以使用:
enemies.pop_back();
或者(与您的非常相似):
在我看来当然不错。您不需要
+0
在敌人中。删除行,但除此之外,它完全可以。它可以工作,是的,但不是理想的方法
首先,添加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
}
模板
无效无序弹出式前端(标准::矢量和矢量)
{
使用std::swap;
交换(vec.front(),vec.back());//恒定时间
vec.pop_back();//恒定时间
}
它将前面的元素与后面的元素交换,然后将其弹出。当然,秩序不会被保留
另一个问题是内存管理方法。任何时候你有明确的清理代码,你已经做了一些错误。应该是
使用或的std::vector
。(注意:不要在容器中使用std::auto_ptr
,它在这方面是不正确的。)对于快速智能指针建议,请使用std::unique_ptr
(如果编译器支持C++0x),或std::/boost::shared_ptr
std::vector<Enemy*> enemies;
enemies.push_back(new Enemy());
现在我们知道,代码> PuxSuff-<代码>不能分配内存,如果<代码>保留< /代码>失败,则在<代码>敌人< /代码>之前抛出异常。
通常:考虑使用共享指针的向量,或<代码> Boo::pTrvector vector < /C> >。这里是指向指针容器的链接,C0wb0y谈论的一个空间:你推回(新敌人)
?难道你不知道把你的敌人推到背后是不公平的吗-D@Pavel:不仅不公平,而且不明智:让你的朋友和你的敌人更亲近。什么叫~敌军()?是vector.erase()/vector.clear()还是删除敌人[0]?@Ryan:delete
调用指向对象的析构函数,然后释放内存。
std::vector<Enemy*> enemies;
enemies.push_back(new Enemy());
std::vector<Enemy*> enemies;
enemies.reserve(1); // or more generally, enemies.reserve(enemies.size()+1);
enemies.push_back(new Enemy());