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