2011-05-07 3 views
3

아래의 코드와 주석을 참조하십시오 :할당 요소

vector<int> v1(10); 
cin>>v1[0]; // allowed 
cin>>v1[1]; // allowed 

// now I want v1 to hold 20 elements so the following is possible: 

cin>>v1[15]>>v[19]; // how to resize the v1 so index 10 to 19 is available. 

답변

5
당신은 단순히 새 값을 추가하기 전에 벡터의 크기를 조정해야

:

v1.resize(20); 
+0

크기를 조정 한 후 push_back을 요구하지 않고 cin을 사용하여 입력 할 수 있습니까? –

+0

@Gunner :'벡터 v1 (10);은'vector v1;과 실질적으로 동일합니다. v1.resize (20);'. 그렇다면'push_back'에 대해 무엇을 가지고 있습니까? (''reserve''와''push_back'')는 무엇입니까? –

+0

@James : 그 반대는 아니지만 그 상황은 그런 것입니다. 임시 변수 대신 벡터에 직접 입력합니다. 결국 양쪽 모두 동일 할 것이지만 대안이 있는지 궁금해하고있었습니다. –

2

당신은 resize을 사용할 수 있습니다 like :

v1.resize(20); 
2

벡터 :: resize()는 크기를 조정하고 기본 죄수로 채 웁니다. tructed objects (int,이 경우에는 중요하지 않으므로).

vector :: reserve()는 공간을 채우지 않고 할당합니다.

원하는 항목이 많을 때까지 push_back()과 같은 항목을 추가 할 수 있습니다. 필요에 따라 크기가 조정됩니다.

+0

중요합니다. 왜냐하면 사람들이 불평하기 전에 (개념적으로, 세부적인 약간 더 복잡한) x [] = T()를 사용하기 때문에 새로운 멤버와 INT를 초기화하는 방법은 POD입니다. POD 값은 초기화 된 값이므로 구성원은 0으로 설정됩니다. –

+0

'예약'은 용량 만 증가시키지 않습니다. 따라서 OP의 경우, 예비 (20) 후에 요소 15와 19에 액세스 할 수 없습니다. 그것을 위해'resize'가 필요합니다. –

+0

@Martin : granted -하지만 의미있는 것은 시간이 많이 소요되는 생성자가 아니거나 자신이 제어 할 수있는 생성자가 아니라는 것입니다. – jwismar

3

당신을 사용할 수 있습니다, 당신은 istream_iterator 반복자 범위를 사용할 수 있으며,이처럼 vector 범위-생성자 되었 cin에서 많은 값을 읽으려면 :

#include <iterator> // for istream_iterator 
#include <vector> 
#include <iostream> // for cin 

// ... 

std::vector<int> v1((std::istream_iterator<int>(std::cin)), // extra() 
        std::istream_iterator<int>()); 

(여분의 괄호는 예방해야합니다 ("C++ most vexing parse"). Cf. 또한 Constructing a vector with istream_iterators.

+0

이것은 정확히 내가 원하는 것은 아니지만 그것의 유용한 기능입니다. 많은 상황에서, 우리가 할 첫 번째 일은 그것을 선언 한 후 벡터에 입력하는 것입니다. –