VECTOR : 시퀸스(순차열) 컨테이너 , 배열컨테이너

  • 배열과 흡사해서 빠르다
  • 접근반복자를 지원하는 배열 기반 컨테이너
  • 원소가 하나의 메모리 블록에 연속하게 저장된다.[배열같이?]
  • 배열기반 컨테이너는 삽입과 제거 동작이 발생하면 메모리가 재할당 되거나 원소가 이동할 수 있으므 로, 반복자가 무효로 된다.
  • 벡터는 할당된 용량을 줄일 수 없기에, 원소가 지워진 후에도 모든 레퍼런스와 포인터를 보장한다. (그러나 삽입하면 모두 무효화)
  • 용량을 줄이기 위해서는 swap을 해서 줄인다.
  • 벡터는 새로운 원소를 삽입할 떄 할당된 메모리가 부족하면 이전 메모리블록을 삭제하고 새로운 메모리블록을 재할당하며 이전 원소를 모두 ***복사

벡터 중간삽입

  1. 벡터에 여유공간이 할당되어 있었을 경우
    -> 여유공간 메모리가 추가 되면서,값이 한자리 씩 이동함

2. 벡터에 여유공간이 할당된게 없을 경우
->전부 재할당되서, 추가된다.

 

벡터 할당된 공간 비우기 (swap 사용)
안해도 일단 메모리 누수 발생은 안하는 듯 함?.

    myvector.reserve(3);                                                          //size는 0이지만, 5개 할당됨
    myvector.reserve(1);                                                          //size는 1
    myvector.reserve(2);                                                          //size는 2
    myvector.reserve(3);                                                          //size는 3
    myvector.clear();                                   //size는 0이되냐, 할당 메모리는 그대로있다

    cout << "capacity : " << myvector.capacity() << endl;              // capacity 5

    {
        vector<int> ().swap(myvector);                                          //
        cout << "capacity : " << myvector.capacity() << endl;           // 0
    }

 

벡터 구조 이미지

 

벡터의 삭제 (비용적게)

  • 벡터의 삭제는 pop_back으로 빼내면, 연속적이었던, 마지막 메모리가 제거된다.
  • 그러나 중간에 있는 요소를 제거하면, 제거되는 요소 빼고 전부 복사되서 메모리 재할당이 된다.
  • 이 경우 SWAP()을 이용해서, 제거할 요소와, 제일 마지막 요소를 교체를 하고 pop_back을 한다.

벡터의 임의 요소에 접근하는 방법으로는 [] 연산자와 at 멤버함수 차이

  • [] 연산자를 사용하면 접근이 빠르지만 범위 점검을 하지 않는다.
  • at() 멤버 함수를 사용하여 접근하면 범위 점검을 수행하며, 범위에 벗어난 요소에 접근하면 out_of_range 예외를 throw 하여 예외처리할 수 있다.

 

'프로그래밍 > STL' 카테고리의 다른 글

Map / MuitlMap  (0) 2019.04.30
Set / MutilSet  (0) 2019.04.30
LIST  (0) 2019.04.30
DEQUE  (0) 2019.04.30
STL (Standard Template Library)  (0) 2019.04.30

+ Recent posts