我有一个指向对象的向量.我需要从向量中删除一个元素并将该元素放在另一个列表中.
我读到擦除可以用来从向量中删除对象,但我还读到它在执行之前调用对象析构函数.
我需要知道擦除对象是否也会破坏它.
Alo*_*ave 60
vector::erase
从向量容器中删除并调用其析构函数,但如果包含的对象是指针,则它不会取得破坏它的所有权.
您必须在每个包含的指针上显式调用delete以删除它指向的内容,例如:
void clearVectorContents( std::vector <YourClass*> & a )
{
for ( int i = 0; i < a.size(); i++ )
{
delete a[i];
}
a.clear();
}
Run Code Online (Sandbox Code Playgroud)
在标准容器中存储原始指针不是一个好主意.如果您确实需要存储必须分配的资源new,那么您应该使用boost::shared_ptr.查看Boost文档.
一个更通用和优雅的解决方案:
此解决方案使用for_each&templates作为@Billy在评论中指出:
// 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;
}
};
Run Code Online (Sandbox Code Playgroud)
这可以称为:
for_each( myclassVector.begin(),myclassVector.end(),
DeleteVector<myclass*>());
Run Code Online (Sandbox Code Playgroud)
其中,myclassVector是包含指向myclass类对象的指针的向量.
用法示例:
#include "functional"
#include "vector"
#include "algorithm"
#include "iostream"
//Your class
class myclass
{
public:
int i;
myclass():i(10){}
};
// 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;
}
};
int main()
{
// Add 10 objects to the vector.
std::vector<myclass*> myclassVector;
for( int Index = 0; Index < 10; ++Index )
{
myclassVector.push_back( new myclass);
}
for (int i=0; i<myclassVector.size(); i++)
{
std::cout << " " << (myclassVector[i])->i;
}
// Now delete the vector contents in a single line.
for_each( myclassVector.begin(),
myclassVector.end(),
DeleteVector<myclass*>());
//Clear the vector
myclassVector.clear();
std::cout<<"\n"<<myclassVector.size();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
Tom*_*rle 10
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();
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
55805 次 |
| 最近记录: |