删除从C所有项目++的std ::矢量(Delete all items from a c++ st

2019-07-21 02:52发布

我试图从删除一切std::vector使用下面的代码

vector.erase( vector.begin(), vector.end() );

但它不工作。


更新:不清除销毁由矢量持有的元素呢? 我不想说,因为我仍在使用的对象,我只是想清空容器

Answer 1:

我认为你应该使用std::vector::clear

vec.clear();

编辑:

不清除破坏由矢量持有的元素呢?

是的,它确实。 它返回内存之前调用向量每个元素的析构函数。 这要看是什么“元素”你是存储在向量。 在下面的例子中,我存储的对象他们的自我的载体内:

class myclass
{
public:
    ~myclass()
    {

    }
...
};

std::vector<myclass> myvector;
...
myvector.clear(); // calling clear will do the following:
// 1) invoke the deconstrutor for every myclass
// 2) size == 0 (the vector contained the actual objects).

如果你想分享不同的容器之间的物体,例如,你可以存储指针给他们。 在这种情况下,当clear被调用时,只有指针内存被释放,实际对象未触及:

std::vector<myclass*> myvector;
...
myvector.clear(); // calling clear will do:
// 1) ---------------
// 2) size == 0 (the vector contained "pointers" not the actual objects).

对于在评论这个问题,我认为getVector()是这样定义的:

std::vector<myclass> getVector();

也许你想返回一个参考:

// vector.getVector().clear() clears m_vector in this case
std::vector<myclass>& getVector(); 


Answer 2:

vector.clear()应该为你工作。 如果你要收缩的能力vector清晰然后一起

std::vector<T>(v).swap(v);


Answer 3:

vector.clear()是有效的一样vector.erase(vector.begin(),vector.end())。

如果你的问题是关于调用delete包含在您的载体每个指针 ,试试这个:

#include <algorithm>

template< typename T >
struct delete_pointer_element
{
    void operator()( T element ) const
    {
        delete element;
    }
};

// ...
std::for_each( vector.begin(), vector.end(), delete_pointer_element );

标准免责声明:代码写在浏览器中,经过测试。



Answer 4:

使用v.clear()清空矢量。

如果您的载体包含指针,明确调用析构函数的对象,但不删除该指针引用的内存。

vector<SomeClass*> v(0);

v.push_back( new SomeClass("one") );

v.clear();  //Memory leak where "one" instance of SomeClass is lost


Answer 5:

v.clear()不工作的一些原因?



Answer 6:

如果你一直在指针容器中,不希望与手动摧毁它们的打扰,然后使用升压shared_ptr的 。 下面是标准::向量样本,但你可以将其用于任何其他STL容器(集,地图,队列,...)

#include <iostream>
#include <vector>
#include <boost/shared_ptr.hpp>

struct foo
{
    foo( const int i_x ) : d_x( i_x )
    {
        std::cout << "foo::foo " << d_x << std::endl;
    }

    ~foo()
    {
        std::cout << "foo::~foo " << d_x << std::endl;
    }

    int d_x;
};

typedef boost::shared_ptr< foo > smart_foo_t;

int main()
{
    std::vector< smart_foo_t > foos;
    for ( int i = 0; i < 10; ++i )
    {
        smart_foo_t f( new foo( i ) );
        foos.push_back( f );
    }

    foos.clear();

    return 0;
}


Answer 7:

添加到上面提到的好处swap().clear()不保证内存释放。 您可以使用swap()如下:

std::vector<T>().swap(myvector);


Answer 8:

如果您的载体看起来像这样std::vector<MyClass*> vecType_pt你必须明确地释放内存,或者如果你的载体样子: std::vector<MyClass> vecType_obj ,构造函数将被称为vector.Please执行下面的例子给出和理解上的差异:

  class MyClass
    {
    public:
        MyClass()
        {
            cout<<"MyClass"<<endl;
        }
        ~MyClass()
        {
            cout<<"~MyClass"<<endl;
        }
    };
    int main() 
    {
        typedef std::vector<MyClass*> vecType_ptr;
        typedef std::vector<MyClass> vecType_obj;
        vecType_ptr myVec_ptr;
        vecType_obj myVec_obj;
        MyClass obj;
        for(int i=0;i<5;i++)
        {
            MyClass *ptr=new MyClass();
            myVec_ptr.push_back(ptr);
            myVec_obj.push_back(obj);
        }
        cout<<"\n\n---------------------If pointer stored---------------------"<<endl;
        myVec_ptr.erase (myVec_ptr.begin(),myVec_ptr.end());
        cout<<"\n\n---------------------If object stored---------------------"<<endl;
        myVec_obj.erase (myVec_obj.begin(),myVec_obj.end());
        return 0;
    }


Answer 9:

class Class;
std::vector<Class*> vec = some_data;

for (unsigned int i=vec.size(); i>0;) {
    --i;
    delete vec[i];
    vec.pop_back();
}
// Free memory, efficient for large sized vector
vec.shrink_to_fit();

性能:THETA(N)

如果纯对象(不建议用于大型数据类型,那么只是vec.clear();



文章来源: Delete all items from a c++ std::vector
标签: c++ stl vector