2011-01-27 7 views
6
std::vector<AClass> vect; 
AClass Object0, Object1, Object2, Object3, Object4; 
vect.push_back(Object0); // 0th 
vect.push_back(Object1); // 1st 
vect.push_back(Object2); // 2nd 
vect.push_back(Object3); // 3rd 
vect.push_back(Object4); // 4th 

질문 1 (축소) : 그것이 0 번째, 및 요소가 보호되는 guarantied (즉, 그 값은 변경되지 않습니다)이 코드로이 벡터의 크기를 조정 한 후 : vect.resize(3) ?"std :: vector"크기 조정. 어떤 요소가 영향을 받습니까?

질문 2 (확장) :이 벡터를 코드 vect.resize(7)으로 확장 한 후;
a. 첫 번째 5 개 요소 (0 번부터 까지 4 번째)는 변경되지 않습니까?
b. 새로 추가 된 두 요소 (5th6th)는 어떻게됩니까? 기본값은 무엇입니까?

+2

참고 : Object0-4는 벡터에 복사됩니다.따라서 벡터의 값은 원래 값과 다릅니다. –

답변

10

질문 1 : 예, 표준 말한다 : erase(begin() + sz, end());

void resize(size_type sz); 

sz < size()하는 경우, 해당.

질문 2 : 크기 조정이 필요하지 않으면 예. 그렇지 않으면 요소가 메모리의 다른 위치에 복사됩니다. 값은 변경되지 않지만 그 값은 다른 곳에 저장됩니다. 모든 반복자, 포인터 및 해당 객체에 대한 참조가 무효화됩니다. 기본값은 AClass()입니다.

+2

무효화 된 반복자를 언급하기 위해 +1. –

1

질문 1 :

예, cplusplus.com에서 "SZ 현재 벡터의 크기보다 작은 경우, 내용이 처음 SZ 요소로 감소가, 나머지는 감소되고."

질문 2 :

a) 첫 번째 요소는 그대로 유지는, 벡터는 단지 크기는 새로운 요소를 추가하는 내부 버퍼의 증가.

b) AClass의 기본 생성자는 새로운 각 요소를 삽입하기 위해 호출됩니다.

+0

'AClass'의 기본 생성자가 private이고 사용 가능한 모든 생성자가 적어도 하나의 매개 변수를 요구한다면 어떻게 될까요? – hkBattousai

+2

@hkB : 그러면 컴파일러 오류가 발생합니다. – fredoverflow

1

벡터가 항상 커지고 끝에 축소되므로 벡터의 크기를 줄이면 마지막 요소 만 제거됩니다. 크기가 조정 된 벡터가 커지면 기본 구성 개체를 새 항목의 값으로 사용하여 끝에 새 요소가 추가됩니다. 클래스의 경우, 이것은 디폴트 constructormas로 작성된 새로운 오브젝트의 값입니다. 프리미티브의 경우 0입니다 (또는 bool의 경우 false).

예, 제거되지 않은 요소는 크기 조정 중에 항상 보호됩니다.

1

예, 벡터 축소시 남아있는 모든 개체는 이전 값을 유지합니다.

벡터를 확장하면 새 슬롯을 채우는 데 사용할 값을 지정하는 매개 변수를 제공합니다. 해당 매개 변수의 기본값은 T()입니다.

관련 문제