从c ++ std :: vector中删除所有项目

我想通过使用下面的代码从std::vector删除一切

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

但它不起作用。


更新:不清除破坏vector的元素? 我不想要那个,因为我还在使用这些对象,我只想清空容器

我想你应该使用std::vector::clear

 vec.clear(); 

编辑:

不清楚破坏vector的元素?

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

 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(); 

vector.clear()应该为你工作。 如果你想随着清晰的情况收缩vector的容量

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

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 ); 

标准免责声明:用浏览器编写的代码,未经testing。

使用v.clear()清空vector。

如果你的向量包含指针,清除调用对象的析构函数,但不删除指针引用的内存。

 vector<SomeClass*> v(0); v.push_back( new SomeClass("one") ); v.clear(); //Memory leak where "one" instance of SomeClass is lost 

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

如果你在容器中保留指针,并且不想用手工销毁它们,那么使用boost shared_ptr 。 这里是std :: vector的示例,但是您可以将它用于任何其他STL容器(set,map,queue …)

 #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; } 

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

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

如果你的向量看起来像这样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; }