2017-10-26 11 views
2

std::vector::push_back()을 호출 할 때 실제로 필요한 메모리를 더 많이 할당하는 것은 재 할당 메커니즘이 처리한다는 것을 알고 있습니다.std :: vector :: resize 및 std :: vector :: push_back에서 상각하기

std::vector<int> v; 
for(unsigned i = 0; i < 100000; ++i) 
{ 
    v.resize(v.size() + 1); 
} 

는이 벡터의 용량이 "임을 보장 : 는 일반적으로 용량이

는 다음과 같이 우리가 요소를 추가, 가정 ... ~ 1.618 배율 2 배 또는 황금 비율 번호와 함께 성장 재배치가 일어나면 두 배가됩니까? 즉, "+1 크기 조정"은 push_back에 대해 수행되는 것과 같은 방식으로 메모리를 할당합니다.

아니면 구현에 의존하는 순수한 것입니까?

+1

나는이 질문을 이해하지 못합니다. 이미 용량이 2 배 (즉, 2 배) ** 또는 ** 황금 비율로 증가한다는 것을 이미 언급했습니다. – user463035818

+0

@ tobi303 OP가'push_back'과 비교하여'resize'에 대해 질문하고 있다고 생각합니다. –

+1

@ChrisDrew 아아, 지금은 질문을 이해하고있다.). 여전히 개선 될 수 있다고 생각하지만 – user463035818

답변

1

재 할당이 발생하면 벡터의 용량이 "배가 된"것이 보장됩니까?

아니요. 메모리 재 할당의 복잡성은 상수로 상각됩니다. 필요에 따라 객체의 용량이 배가되는지 또는 다른 요인에 의해 증가되는지 여부는 구현에 따라 다릅니다. 이와 push_back

예에 대해 수행 될 때

은 "1 크기 조정은"메모리 같은 방법으로 할당 할 것이다.

std::vector::resize(size_type sz)szsize()보다 클 때 sz - size() 값 초기화 요소를 시퀀스에 추가합니다.

insert(end(), sz-size(), <value initialized object>); 

std::vector::insert, std::vector::emplacestd::vector::push_back 메모리 할당에 대해 동일한 복잡성이 - 상수 상각 : 즉 동일하다.

+3

OP가'resize'에 대해 질문하고있다. –

+0

@ChrisDrew, 업데이트 된 답변보기 –

+0

"아니오"는 "doubled"라는 단어에만 반응하고 OP의 진짜 질문은 (resize에 push_back과 동일한 상환 된 상수 동작이 있는지 여부)에 대한 대답이 아니기 때문에, 마지막 문장 (2보다 다른 다른 요소가 가능하다고 설명하는 곳)을 첫 번째 문장 옆으로 옮깁니다. "doubled"라는 단어는 따옴표로 묶여 있으며 OP는 이미 다른 가능한 요소를 언급하고 그의 제목에 amortizing이라는 단어를 사용했습니다. –

0

벡터는 (상각)를 지원하는 일련 용기 일정 시간 넣고 마지막 소거 동작이고; [vector.overview]

경우 크기() < SZ, SZ 추가 - 시퀀스의 크기()의 기본 요소를 삽입.

(크기 조정) IMHO는 재배치가 발생하면 벡터의 용량이 "배가된다"는 것을 의미합니다.