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
'Development Tip' 카테고리의 다른 글
kotlin에서 "instanceof"클래스를 확인하는 방법은 무엇입니까? (0) | 2020.12.06 |
---|---|
경과 시간 계산 (0) | 2020.12.06 |
document.getElementById를 사용하여 iframe 내부의 요소를 선택하는 방법 (0) | 2020.12.06 |
TypeScript에서 정적 메서드에 액세스하는 방법 (0) | 2020.12.06 |
중첩 된 개체의 동적 설정 속성 (0) | 2020.12.06 |