2010-04-13 8 views
38

벡터에서 .reserve (items)를 사용하면 벡터는 필요한 항목 수를 추측 할 수있을만큼 충분한 메모리를 할당합니다.std :: vector :: clear()를 호출하면 std :: vector :: capacity()가 0으로 설정됩니까?

나중에 .clear()를 사용하면 벡터를 지우거나 이전 정의 된 예약을 저장합니까?

감사합니다.

+0

그건 속이다. http://stackoverflow.com/questions/586634/ – sbi

+9

아니, 그 질문도 _mention_'clear()'하지 않습니다. "깨끗한"이라는 단어가 사용 된 유일한 위치는 "나에게 명확하지 않습니다 ..."로 시작하는 주석에 있습니다. – MSalters

+1

[벡터가 통화량을 변경하여 용량을 변경하는 방법에 대한 표준은 무엇이라고 말합니까? ] (http://stackoverflow.com/questions/18467624/what-does-the-standard-say-about-how-calling-clear-on-a-vector-changes-the-capac) –

답변

44

std::vector<T>::clear()이 크기에 영향을줍니다. 용량에 영향을주지 않을 수도 있습니다. 용량을 재설정를 들어, 스왑 트릭를 사용

std::vector<int> v1; 

    // somehow increase capacity 

    std::vector<int>().swap(v1); 

참고 :이 오래된 대답은 여전히 ​​(따라서 사람들이 그것을 읽고) upvotes을 받고 있기 때문에, 그 C를 추가 할 필요를 느끼지 ++ 11에는 벡터가 사용되지 않는 용량을 제거하도록 요청하는 std::vector<...>::shrink_to_fit()이 추가되었습니다.

+1

http://en.wikibooks.org/wiki/More_C%2B%2B_Idioms/Clear-and-minimize 비슷한 "수축을 피하십시오"의 용량을 줄이기 위해 그렇게 생각하지 않아도됩니다. 요소의 실제 수 (존재하는 경우)에 벡터. –

+1

용량에 영향을 줄 수도 있습니다. 용량을 변경하거나 재 할당하는 것을 피하기 위해 표준에 의해 요구되는 것은 아니다 _. 따라서 아무런 보장이 없습니다. –

+0

@underscore_d : 감사합니다. 이 문제를 해결하기 위해 대답을 변경했습니다. – sbi

0

기본 버퍼 크기에는 영향을 미치지 않습니다. 그래서 실제로 버퍼를 없애거나 작게 만들려면 this 같은 트릭을 사용해야합니다.

10

비헤이비어가 표준에서 지정되어 있다고는 생각되지 않지만 아마 예약 된 메모리를 해제하지는 않습니다.

편집 : 좋아, 단지 확인 표준은 사후 조건이라고 말한다 size() == 0이 나는 ​​예약 된 메모리에 보유하지 않는 vector 구현 건너하지 않은 있지만.

+6

표준 및 "아마도"(나는 일반적으로 메모리가 남아있을 것으로 예상했다). 임베디드 시스템에서 저는 실제로 메모리를 해제하는 구현체를 발견했습니다. –

7

아니요. vector::capacity()에 전화하여 시험해보십시오.

자세한 내용은 shrink_to_fit입니다. 표준의 작업 초안 언급 :

비고 : shrink_to_fit 크기에 용량()을 줄이기 위해 구속력 요청 ()이다. [ 참고 : 요청은 에 대한 바인딩이며 구현 별 최적화에 대한 위도 허용입니다. -end 노트] 0 분명히 호출 (에

1

아니,이 설정되지 않습니다 준비 제도 이사회()) 각 요소의 소멸자를 호출하고 공의 크기의 컨테이너를 떠나, 벡터에서 제거하지만, 용량은 변경되지 않습니다.

+0

구현시 변경되지 않은 채로 남아 있습니다 ._ Standard에서는이를 요구하지 않으므로 용량 및 할당은'clear()'에서 변경 될 수 있습니다. –

관련 문제