나는이 진술들을 보았습니다.
resize(n)
– ‘n’요소를 포함하도록 컨테이너의 크기를 조정합니다.
shrink_to_fit()
– 크기에 맞게 컨테이너 용량을 줄이고 용량을 초과하는 모든 요소를 파괴합니다.
이 기능들 사이에 중요한 차이점이 있습니까? 그들은 C ++에서 벡터 아래에옵니다.
답변
벡터에는 다른 것을 의미하는 두 개의 “길이”속성이 있습니다.
size
벡터에서 사용 가능한 요소의 수입니다. 저장 한 수입니다. 이것은 개념적 길이입니다.capacity
벡터가 현재 할당 한 메모리 양에 맞는 요소 수입니다.
capacity >= size
항상 사실이어야하지만, 그들이 항상 평등 할 이유는 없습니다. 예를 들어, 요소를 제거 할 때 할당을 줄이면 버킷 하나를 작게 할당하고 나머지 내용을 “할당, 이동, 해제”로 새 할당을 만들어야합니다.
마찬가지로 capacity == size
요소를 추가하고 추가하면 벡터가 하나의 요소 (다른 “할당, 이동, 자유”연산)만큼 할당을 늘릴 수 있지만 일반적으로 두 개 이상의 요소를 추가하게됩니다. 용량을 늘려야하는 경우 벡터는 용량을 둘 이상 증가 시켜 모든 요소를 다시 이동하기 전에 여러 개의 요소를 추가 할 수 있습니다.
이 지식으로 귀하의 질문에 답변 할 수 있습니다.
std::vector<T>::resize()
배열 의 크기 를 변경합니다 . 현재 크기보다 작게 크기를 조정하면 초과 객체가 파괴됩니다. 현재 크기보다 크게 크기를 조정하면 끝에 추가 된 “새”개체가 기본적으로 초기화됩니다.std::vector<T>::shrink_to_fit()
현재 크기와 일치하도록 용량 을 변경 하도록 요청합니다 . (이 구현은 이 요청을 이행 하지 않을 수도 있고 그렇지 않을 수도 있습니다. 용량을 줄이지 만 크기와 같지 않을 수도 있습니다. 전혀 수행하지 않을 수도 있습니다.) 요청이 이행되면 사용되지 않은 부분 중 일부 또는 전부가 삭제됩니다. 벡터의 할당 일반적으로 벡터 작성을 마치면 다른 항목을 추가하지 않습니다. (추가 할 항목 수를 미리 알고 있다면 아무 것도std::vector<T>::reserve()
하지 않고 항목을 추가하기 전에 벡터에 알리는 것이 좋습니다shrink_to_fit
.)
따라서 벡터에 개념적으로 얼마나 많은 것들이 있는지resize()
변경 하는 데 사용 합니다 .
shrink_to_fit()
벡터 에 개념적으로 얼마나 많은 것들이 있는지 변경 하지 않고 벡터가 내부적으로 할당 한 초과 공간을 최소화하기 위해 사용 합니다 .
답변
shrink_to_fit()
– 크기에 맞게 컨테이너 용량을 줄이고 용량을 초과하는 모든 요소를 파괴합니다.
그것은 무슨 일이 일어 났는지에 대한 오해입니다. 분명히, 용량 부분 이외의 모든 요소를 파괴하면 정확하지 않습니다.
C ++에서 동적 메모리가 객체에 사용되는 경우 두 단계가 있습니다.
- 메모리는 객체에 할당됩니다.
- 메모리 위치에서 객체가 초기화 / 구성됩니다.
동적으로 할당 된 메모리의 객체가 삭제되면 두 단계가 있으며,이 단계는 구성 단계를 반영하지만 반대 순서로 수행됩니다.
- 메모리 위치의 객체가 손상되었습니다 (내장 유형의 경우 이것은 noop입니다).
- 객체가 사용하는 메모리가 할당 해제됩니다.
컨테이너 크기 를 넘어 할당 된 메모리 는 버퍼입니다. 제대로 초기화 된 개체를 보유하지 않습니다. 그것은 단지 원시 메모리입니다. shrink_to_fit()
추가 메모리가 없지만 해당 위치에 객체가 없는지 확인하십시오. 따라서 아무것도 파괴되지 않고 메모리 만 할당 해제됩니다.
답변
C ++ 표준에 따르면 shrink_to_fit
효과 : shrink_to_fit은 capacity ()를 size ()로 줄이기위한 바인딩이 아닌 요청입니다.
그리고 resize
효과 : sz <size () 인 경우 시퀀스에서 마지막 size ()-sz 요소를 지 웁니다. 그렇지 않으면 sz-size () 기본 삽입 요소를 순서에 추가합니다.
기능이 다른 일을하는 것은 분명합니다. 또한 첫 번째 기능에는 매개 변수가없고 두 번째 기능에는 두 개의 매개 변수가 있습니다. shrink_to_fit
메모리를 재 할당 할 수 있지만 함수 는 컨테이너의 크기를 변경하지 않습니다.