vector.resize와vector.reserve의 차이

1883 단어 vector
reserve는 용기에 미리 남겨진 공간이지만 원소 대상을 실제로 만들지는 않습니다. 대상을 만들기 전에 용기 안의 원소를 인용할 수 없기 때문에 새로운 원소를 추가할 때pushback()/insert() 함수.
resize는 용기의 크기를 바꾸고 대상을 만듭니다. 따라서 이 함수를 호출하면 용기 내의 대상을 인용할 수 있습니다. 따라서 새로운 요소를 추가할 때operator[] 조작부호를 사용하거나 교체기로 원소의 대상을 인용합니다.
게다가 두 함수의 형식은 차이가 있다. reserve 함수 다음에 있는 매개 변수, 즉 미리 남겨진 용기의 공간이 필요하다.resize 함수는 두 개의 매개 변수가 있습니다. 첫 번째 매개 변수는 용기의 새로운 크기이고, 두 번째 매개 변수는 용기에 있는 새로운 요소를 포함합니다. 이 매개 변수가 생략되면 원소 대상의 기본 구조 함수를 호출합니다.다음은 두 함수 사용 예입니다.
vector<int> myVec; 


myVec.reserve( 100 ); //  , 


//  []  


for (int i = 0; i < 100; i++ ) 


...{ 


myVec.push_back( i ); //  


} 


myVec.resize( 102 ); //   


myVec[100] = 1; //  


myVec[101] = 2; 


 
이 두 인터페이스를 처음 접하면 헷갈릴 수 있습니다. 사실 인터페이스의 명칭은 기능에 대한 절호의 설명입니다.resize는 크기를 재분배하는 것이고,reserve는 일정한 공간을 미리 남겨 두는 것입니다.이 두 인터페이스는 차이점도 있고 공통점도 있다.다음은 그것들의 세부 사항에 대해 분석을 진행한다.
resize의 의미를 실현하기 위해 resize 인터페이스는 두 가지 보증을 했다.
첫째, 구간 [0, new size) 범위 내의 데이터가 유효하다는 것을 보증합니다. 만약에 index가 이 구간에 표시되면vector[indext]는 합법적입니다.둘째, 구간 [0, new size) 범위 이외의 데이터가 무효임을 보증합니다. 만약 아래 표시된 index가 구간 밖에 있다면vector[indext]는 불법입니다.reserve는vector의 공간 크기 (capacity) 가 인자가 지정한 크기 n에 최소한 도달하도록 보장할 뿐입니다.구간[0,n) 범위 내에서 만약에 index라고 표시된다면vector[index]는 이런 방문이 합법적일 수도 있고 불법일 수도 있으니 구체적인 상황에 따라 정한다.
resize와 Reserve 인터페이스의 공통점은 바이어의 공간 크기 (capacity) 가 매개 변수가 지정한 크기에 최소한 도달하도록 보장한다는 것이다.
두 인터페이스의 소스 코드가 매우 간단하기 때문에 여기에 그것들을 붙일 수 있다.
void resize(size_type new_size) { resize(new_size, T()); }
void resize(size_type new_size, const T& x) {
if (new_size < size()) 
erase(begin() + new_size, end()); // erase , 
else
insert(end(), new_size - size(), x); //  , 

좋은 웹페이지 즐겨찾기