GOTW 54에서 작품을 조정하고 클리어하지 않는 이유는 무엇입니까?
문제
기사를 참조하십시오 gotw 54 Herbsterter에 의해 그는 설명합니다
벡터 또는 디크를 "수축하기"하는 올바른 방법
벡터 또는 Deque를 완전히 지우는 올바른 방법
우리는 그냥 사용할 수 있습니까?
container.resize()
그리고container.clear()
위의 작업을 위해 아니면 내가 뭔가를 놓치고 있습니까?
해결책
벡터가 보유하는 두 가지가 있습니다. size
vs capacity
. 당신이 그냥 resize
벡터, 용량 (메모리의 양)이 변경되어야한다는 보장은 없습니다. resize
벡터 용량의 양이 아니라 사용량과 관련된 작업입니다.
예를 들어.
size == how much you are using
capacity == how much memory is reserved
vector<int> v(10);
v.resize(5); // size == 5 but capacity (may or may) not be changed
v.clear() // size == 0 but capacity (may or may) not be changed
결국, 모든 작업마다 용량이 변경되어서는 안됩니다. 이로 인해 많은 메모리 할당/딜로 위치 오버 헤드가 제공되기 때문입니다. 그는 당신이 필요하다면 "거래를 할당하십시오" 메모리 예약 벡터에 의해 그렇게하십시오.
다른 팁
resize () 또는 clear () 작업이 아닙니다. 그만큼 .capacity()
벡터의는 적어도 전류만큼 큰 것으로 보장됩니다. size()
벡터의, 적어도 reserve()
D 용량. 또한, 이것.capacity()
축소되지 않으므로 적어도 이전과 같은 크게 큽니다. size()
또는 reserve()
ation.
이제 .capacity()
벡터의는 단지 예약 된 메모리 일뿐입니다. 종종 그 메모리 코인 객체가 모두있는 것은 아닙니다. 크기 조정은 객체를 제거하지만 메모리를 재활용하지는 않습니다. 벡터는 더 큰 버퍼를 할당 할 때만 메모리 버퍼 만 재활용 할 수 있습니다.
스왑 트릭은 모든 Ojects를 더 작고 더 적절한 메모리 버퍼로 복사하여 작동합니다. 그 후 원래 메모리 버퍼를 재활용 할 수 있습니다. 이것은 벡터의 메모리 버퍼 만 자랄 수 있다는 이전의 진술을 위반하는 것으로 보입니다. 그러나 스왑 트릭으로 일시적으로 2 벡터.
벡터의 크기와 용량이 있습니다. X 요소를 보유 할 수 있지만 Y 요소에 대해서는 초기화되지 않은 메모리가 있습니다. 일반적인 구현 지우기에서 크기를 조정할 때 크기를 조정하고 클리어는 용량에 영향을 미치지 않습니다. 벡터는 나중에 새 항목을 추가하려면 메모리를 그 자체로 유지합니다.