Удалить все элементы из C++ std:: vector
Я пытаюсь удалить все от std::vector С помощью следующего кода
vector.erase( vector.begin(), vector.end() );
но это не работает.
Update: разве clear не уничтожает элементы, удерживаемые вектором? Я не хочу этого, так как я все еще использую объекты, я просто хочу очистить контейнер
9 ответов:
Я думаю, что вы должны использовать
std::vector::clear:vec.clear();
EDIT:
не ясно уничтожить элементы удерживается вектором?
Да, это делает. Он вызывает деструктор каждого элемента в векторе перед возвратом памяти. Это зависит от того, какие "элементы" вы храните в векторе. В следующем примере я сохраняю сами объекты внутри вектора:
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вместе с clear thenstd::vector<T>(v).swap(v);
вектор.очистить () - это фактически то же самое, как вектор.стереть( вектор.начало (), вектор.конец.) )(
Если ваша проблема заключается в вызове
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 );стандартный отказ от ответственности: код, написанный в браузере, непроверенные.
использовать v. clear () пустой вектор.
если ваш вектор содержит указатели, clear вызывает деструктор для объекта, но не удаляет память, на которую ссылается указатель.
vector<SomeClass*> v(0); v.push_back( new SomeClass("one") ); v.clear(); //Memory leak where "one" instance of SomeClass is lost
Если вы храните указатели в контейнере и не хотите возиться с их уничтожением вручную, то используйте 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().чтоclear()не гарантирует освобождения памяти. Вы можете использоватьswap()следующим образом:std::vector<T>().swap(myvector);
Если ваш вектор выглядит так
std::vector<MyClass*> vecType_ptвы должны явно освободить память ,или если ваш вектор выглядит так:std::vector<MyClass> vecType_obj, конструктор будет вызван вектором.Пожалуйста, выполните пример, приведенный ниже , и поймите разницу: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; }
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();производительность: тета (n)
если чистые объекты (не рекомендуется для больших типов данных, то просто век.очистить();
Comments