Development Tip

C ++ std :: vector에서 모든 항목 삭제

yourdevel 2020. 12. 6. 22:10
반응형

C ++ std :: vector에서 모든 항목 삭제


std::vector다음 코드를 사용하여 a에서 모든 것을 삭제하려고 합니다.

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

하지만 작동하지 않습니다.


업데이트 : 벡터가 보유한 요소를 지우지 않습니까? 나는 그것을 원하지 않는다. 나는 여전히 객체를 사용하고 있기 때문에 컨테이너를 비우고 싶다.


나는 당신이 사용해야한다고 생각합니다 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(); 

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

표준 고지 사항 : 브라우저로 작성된 코드, 테스트되지 않음.


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

Performance: theta(n)

If pure objects (not recommended for large data types, then just vec.clear();

참고URL : https://stackoverflow.com/questions/1525535/delete-all-items-from-a-c-stdvector

반응형