문제

크기를 조정하는 방법이 있습니까? std::vector 더 이상 이전에 예약 된 공간이 필요하지 않을 때 용량을 낮추기 위해?

도움이 되었습니까?

해결책

효과적인 STL, Scott Meyers, 항목 17 : 사용 swap 과도한 용량을 다듬는 속임수.

vector<Person>(persons).swap(persons);

이후, persons "적합하기 위해 축소"입니다.

이것은 사실에 의존합니다 vector의 사본 생성자는 복사되는 요소에 필요한만큼 메모리만큼만 할당됩니다.

다른 팁

C ++ 11을 사용하는 경우 사용할 수 있습니다. vec.shrink_to_fit(). VS2010에서는 적어도 스왑 트릭을 수행합니다.

기존 벡터에서 새 임시 벡터를 작성한 다음 기존 스왑 메서드를 호출하여 임시를 전달합니다. 임시 (구식, 대형 버퍼와 함께)가 범위를 벗어나게하십시오.

Hey Presto, 당신의 벡터는 내용에 맞는 크기가 정확히 높습니다.

이것이 많은 복사 및 할당처럼 들린다면 - 이것은 벡터가 현재 예약 된 한계를 지나서 재 할당해야 할 때마다하는 일이라는 것을 명심하십시오.

편집] 예, 방금 Sebastien과 동일하게 더 많은 말로 말했습니다. Stackoverflow Race-Condition의 또 다른 사례 ;-)

스왑 트릭은 객체의 용량을 줄이는 효과적인 방법이며, 내 벡터의 내용을 새로 만든 사본 구성으로 바꿉니다.

vector<Person>(persons).swap(persons);

person.capacity ()를 보장 할 수 없습니다. 스왑 트릭은 크기와 같다.

C ++ 11 도입 shrink_to_fit ().

Shrink_to_fit ()와 스왑 트릭이 용량 크기가 벡터 크기로 효과적으로 줄어드는 것을 보장하지는 않습니다.

어쨌든 shrink_to_fit ()는 반복자를 무효화 할 수 있습니다 (재 할당이 발생하는 경우) : 라이브러리의 실제 구현에 따라 다릅니다.

스왑 트릭에는 사람과 사람과 사람의 구성 () 파괴의 사본 구성을 필요로한다는 점을 명심하십시오. Shrink_to_fit ()는이 모든 복사를 피할 수 있으며 반복자를 유효하게 할 수 있습니다. 할 수 있었다. 그러나 때때로 Shrink_to_fit ()가 스왑 트릭 측면에서 구현됩니다 ...

당신은 동등한 것을 찾고 있습니다 QVector :: 스퀴즈 그리고 STL에는 그것이 설명 적으로 존재하지 않는 것이 두렵습니다. STL 구현에 맞는 경우 Sébastien의 답변을 찾으십시오.

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