std::vector
클래스는 내부 메모리를 자동으로 관리합니다. 그것은 당신이 넣은만큼 많은 아이템을 보유 할 수있게 확장되지만, 일반적으로 아이템을 제거 할 때 자체적으로 축소되지는 않습니다 (물론 파괴 될 때 메모리를 해제 할지라도).
std::vector
에는 "크기"라는 두 가지 관련 개념이 있습니다. 첫 번째는 예약 된 크기로, 벡터 요소를 저장하기 위해 시스템에서 할당 한 메모리 양입니다. 두 번째는 "used"크기이며, 이는 얼마나 많은 요소가 논리적으로 벡터에 있는지를 나타냅니다. 분명히 예약 된 크기는 적어도 사용 된 크기만큼 커야합니다. size()
방법으로 사용 된 크기를 알아낼 수 있으며 (이미 알고있는 것으로 알고 있습니다) capacity()
방법을 사용하여 예약 크기를 찾을 수 있습니다.
일반적으로 사용 된 크기와 예약 된 크기가 같고 새 요소를 삽입하려고하면 벡터는 이전 예약 크기의 두 배가되는 새 내부 버퍼를 할당하고 기존 요소를 모두 해당 버퍼에 복사합니다 . 이것은 당신이 가지고있는 반복자를 무효화한다는 점을 제외하고는 여러분에게 투명합니다. 이전에 AFAIK에서 언급했듯이 대부분의 STL 구현은 삭제 된 것에 대한 응답으로 예약 된 크기를 축소하지 않습니다. 당신이 증가reserve()
방법을 사용하여 예약 된 크기로 벡터를 강제 할 수있는 동안
불행하게도,이 예약 용량을 감소 작동하지 않습니다. 지금까지 내가 말할 수있는 용량의 감소를 초래에 대한 가장 좋은 방법은 다음을 수행하는 것입니다
std::vector<Bullet>(myVector).swap(myVector);
를 이것이하지만와 (원래 벡터의 카피 인 임시 벡터를 만들 수있다 할 것입니다 최소 필요 용량), 두 벡터의 내부 버퍼를 교체하십시오.이렇게하면 원본 벡터의 데이터는 같지만 예약 크기가 작아집니다.
이제 임시 사본을 만드는 작업이 비교적 비용이 많이 들기 때문에 (정상적인 읽기/삽입/삭제보다 훨씬 많은 프로세서 시간이 소요됨) 요소를 지울 때마다 수행하지 않으려 고합니다. 같은 이유로, 벡터가 기존 크기를 초과해야 할 때 벡터를 1 씩 늘리지 않고 예약 된 크기를 두 배로 늘리는 이유입니다. 따라서 내가 추천하는 것은 상대적으로 많은 수의 요소를 지우고 곧 더 많은 요소를 추가하지 않을 것이라는 것을 알고 있다면 위의 스왑 트릭을 수행하여 용량을 줄이는 것입니다.
마지막으로 std::vector
이외의 것을 사용하는 것도 좋습니다. 자주 사용하는 것처럼 보이는 벡터 중간에서 요소를 지우는 것은 많은 다른 유형의 데이터 구조와 비교할 때 느린 작업입니다 (벡터는 이후 모든 요소를 구멍을 채우기 위해 한 슬롯 뒤로 복사해야하기 때문에) . 어떤 데이터 구조가 목적에 가장 적합한지는 데이터로 무엇을하고 있는지에 따라 다릅니다.
어떻게 지내니? STL, Boost, roll-your-own, 또는 다른 것? – John
STL 벡터는 하나입니다 – jmasterx
크기를 줄이기 위해'std :: vector :: resize()'를 사용할 수 있습니다. http://www.cplusplus.com/reference/stl/vector/resize –