GOTW 54에서 작품을 조정하고 클리어하지 않는 이유는 무엇입니까?

StackOverflow https://stackoverflow.com/questions/1720953

  •  19-09-2019
  •  | 
  •  

문제

기사를 참조하십시오 gotw 54 Herbsterter에 의해 그는 설명합니다

  1. 벡터 또는 디크를 "수축하기"하는 올바른 방법

  2. 벡터 또는 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 요소에 대해서는 초기화되지 않은 메모리가 있습니다. 일반적인 구현 지우기에서 크기를 조정할 때 크기를 조정하고 클리어는 용량에 영향을 미치지 않습니다. 벡터는 나중에 새 항목을 추가하려면 메모리를 그 자체로 유지합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top