VECTOR : 시퀸스(순차열) 컨테이너 , 배열컨테이너
- 배열과 흡사해서 빠르다
- 접근반복자를 지원하는 배열 기반 컨테이너
- 원소가 하나의 메모리 블록에 연속하게 저장된다.[배열같이?]
- 배열기반 컨테이너는 삽입과 제거 동작이 발생하면 메모리가 재할당 되거나 원소가 이동할 수 있으므 로, 반복자가 무효로 된다.
- 벡터는 할당된 용량을 줄일 수 없기에, 원소가 지워진 후에도 모든 레퍼런스와 포인터를 보장한다. (그러나 삽입하면 모두 무효화)
- 용량을 줄이기 위해서는 swap을 해서 줄인다.
- 벡터는 새로운 원소를 삽입할 떄 할당된 메모리가 부족하면 이전 메모리블록을 삭제하고 새로운 메모리블록을 재할당하며 이전 원소를 모두 ***복사
벡터 중간삽입
- 벡터에 여유공간이 할당되어 있었을 경우
-> 여유공간 메모리가 추가 되면서,값이 한자리 씩 이동함
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 |