Удалить все элементы из C++ std:: vector



Я пытаюсь удалить все от std::vector С помощью следующего кода



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


но это не работает.





Update: разве clear не уничтожает элементы, удерживаемые вектором? Я не хочу этого, так как я все еще использую объекты, я просто хочу очистить контейнер

1063   9  

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 then

std::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

и 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(). что 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

    Ничего не найдено.