我有一个指向对象的向量。我需要从向量中删除一个元素并将该元素放在另一个列表中。
我读到擦除可以用来从向量中删除对象,但我还读到它在执行之前调用对象析构函数。
我需要知道擦除对象是否也会破坏它。
答案 0 :(得分:58)
vector::erase
从向量容器中删除并调用其析构函数,但如果包含的对象是指针,则它不会取得破坏它的所有权。
您必须在每个包含的指针上显式调用delete以删除它指向的内容,例如:
void clearVectorContents( std::vector <YourClass*> & a )
{
for ( int i = 0; i < a.size(); i++ )
{
delete a[i];
}
a.clear();
}
在标准容器中存储原始指针不是一个好主意。如果您确实需要存储必须由new
分配的资源,那么您应该使用boost::shared_ptr
。查看Boost documentation。
更通用的&amp;优雅的解决方案:
此解决方案使用for_each
&amp; {@ 1}} @Billy在评论中指出:
templates
这可以称为:
// Functor for deleting pointers in vector.
template<class T> class DeleteVector
{
public:
// Overloaded () operator.
// This will be called by for_each() function.
bool operator()(T x) const
{
// Delete pointer.
delete x;
return true;
}
};
其中,for_each( myclassVector.begin(),myclassVector.end(),
DeleteVector<myclass*>());
是包含指向myclassVector
类对象的指针的向量。
用法示例:
myclass
答案 1 :(得分:9)
vector<MyObject>
,则会MyObject::~MyObject
调用。vector<MyObject*>
,则不会调用delete <MyObject
instance>
。要在两个向量之间移动MyObject,您需要先将其插入目标向量,然后擦除原始向量。请注意,这将创建对象的新副本。移动指针时,您可以将指针保存在临时变量中,将其从矢量中删除,然后插入到您需要的任何位置。
这是删除并删除向量中所有项目的另一种简单方法:
template<class T> void purge( std::vector<T> & v ) {
for ( auto item : v ) delete item;
v.clear();
}
答案 2 :(得分:2)
是的,当然会。如果矢量中不存在该对象,那么它还存在于哪里?
编辑:这将不删除指针指向的任何内容。您应该使用自动生命周期管理指针(如shared_ptr
)来管理对象生命周期。
答案 3 :(得分:2)
是的,erase
会破坏元素。但是,如果您将元素放在另一个容器中,则可能会将其复制到另一个容器中。遇到问题的唯一方法是将指针或类似的东西复制到另一个容器中。
答案 4 :(得分:2)
是。 vector::erase
销毁被删除的对象,包括调用它的析构函数。