다시 읽기 STL 소스 코드 분석 : 벡터

벡터

데이터 구조 :

세 가지 데이터 멤버 :

반복자 시작 // 헤드 포인팅 벡터 공간은 사용, 즉 vector.begin ()

반복자 마무리; // 엔드 포인트 벡터 공간이 현재 사용, 즉 vector.end ()

반복자 end_of_storage, 현재 사용 가능한 // 엔드 포인트 벡터 공간

중요 기능 :

() 시작 : 반환이 시작;

끝 () : 리턴 마무리;

크기 () : 반환 말하자면 size_type (끝 () -) (시작); // 말하자면 size_type 类似于 VALUE_TYPE

용량 () : 반환 end_of_storage 시작;

) (크기 조정 :

먼저 크기 ()보다 작은 경우 새로운 크기가 원래 크기보다 작은 지 여부를 결정하는 요소는 new_size 후에 소거 될

그렇지 않으면, 엔드 않는 요소를 작성 (후)

공극 크기 조정 (말하자면 size_type의 new_size, CONST T 및 X) 
{ 
	경우 (new_size <크기 ()) 
		소거 (시작 () + new_size, 단부 ()); 
	다른 
		삽입 (단부 () new_size 크기 (), X); 
}

분명 () () (끝 () 시작)을 삭제; //에만 소멸자, 공간이 해제되지 않습니다  

와 push_back () :

먼저 공간 마무리로 사용할 경우, 구성 가능하며, 변속 완료 여부를 결정한다;

그렇지 않은 경우, ()에 대한 호출은 특정 설명 insert_aux을 따라 이동 insert_aux;

보이드와 push_back (CONST T 및 X) 
{ 
	경우 (! = 마무리 end_of_storage) { 
		구성 (마무리 X); 
	++ 마무리; 
	} 
	다른 
		insert_aux (단부 (), X); 
}

  

insert_aux ()

코드 P122 페이지

특정 프로세스 :

우선, 현재의 능력 (완료! = End_of_storage)을하는지 여부가 결정되고, 원래의 위치에 새로운 요소를 삽입 전 여기서 위치 마감) 변화 소자는, 다음으로, 용량이있는 경우, 마무리 위로 이동하면서.

더 용량이 없다면, 새로운 공간 제 (원래의 2 배)를 계산하고, 새로운 차원의 크기에 대응.

공간과 여유 공간의 완료 후 소멸자 소스 요소를 복사, 새로운 공간에 복사 한 개방 요소의 완료 후, 세 반복자 시작, 마무리 및 end_of_storage를 다시 조정

 

와 pop_back ()

단지 앞으로와 pop_back ()와 소멸자 원래 마무리 다시 () 요소는 공간을 해제하지 않습니다

보이드와 pop_back () 
{ 
  --finish; 
  (마무리) 32 파괴; 
}

  

삭제()

다음 첫 번째 요소로 [제, 마지막 부분), 마지막으로 첫 번째 복사본 [마침)를 삭제 한 다음 요소를 피복 한 후 영역을 취소, 즉, [I 마침)

그 커버의 단부 위치로 이동 마무리, 소자는 새로운 삽입 위치를 반환

반복자 소거 (제 1 반복자 반복자 마지막) 
{ 
	반복자 I = 복사 (마지막 마무리 제); 
	파괴 (I, 마감) 
	마무리 - 마침 = (마지막 제); 
	돌아 가지; 
}

  

끼워 넣다()

P125 책

첨가 원소의 수와 같거나 더 삽입 할 수있는 경우 예비 공간이 먼저 결정된다.

이 경우 :

삽입 점은 다음 요소의 새로운 수의 소자의 수보다 큰 경우에는 우선, 소자의 개수는, 삽입 점 후 결정된다 :

그 위치 때문에, 마무리 (총 n 개의 요소로 구성 요소의 제 [마무리 N, 마감)), 갱신 마침 old_finish 및 (공 MN 소자) 후의 요소 다음 [위치 old_finish-N), 이후 ~ m 소자 old_finish 전체를 종료하고, 공간 N 원소를 비웠다 이동된다. 새로운 요소를 덮는 아직 [position 위치 + N)이다.

그런 다음 새로운 요소의 수보다 작 :

최초 생성 요소는 마무리 한 후 상기 나노, 나노 개의 위치에 삽입된다.

그런 다음 위치 ~ old_finish m 요소는, 새로운 꼬리 있도록 공간을 비워 m 요소를 이동했다.

인서트 요소 postition 재기록 ~ old_finish, m의 합계는, 상기 n + m에서의 m = N은, 삽입이 완료된다.

 

공간이 부족한 경우 :

먼저 공간을 결정 : LEN = old_size는 + 최대 (old_size는, N); // 새 길이 또는 두 번 확장이 ​​설치 될 수 있으며, 확장 old_size는 + N을 잡아 정확히 맞도록해야합니다 경우

그런 다음 새로운 요소에 대한 공간을 할당

그리고 복사 새로운 공간에 삽입 지점 전에 원래 요소하고는 N의 요소를 삽입, 새로운 공간에 삽입 지점 이후 다음 원본 요소를 채운다.

그리고 소멸자 요소 원래 공간과 여유 공간.

마지막으로, 새로운 공간에 세 반복자의 위치를 ​​조정

추천

출처www.cnblogs.com/lxy-xf/p/11455670.html