STL의 Vector와 List는 언듯 보기엔 비슷하지만 큰 차이점이 있다. 

 

Vector의 방식은 메모리 할당을 연속적으로 하고, List는 따로따로 할당을 한다.

따라서 Vector는 배열과 같은 방식으로 사용할 수 있지만 List는 그렇지 않다.

 

단순하게 놓고 본다면 Vector는 배열과 비슷하고 List는 Linked List와 비슷하다.

이제 여기서 발생하는 현상(?)들을 보자.

 

 1. 메모리 할당

Vector는 미리 일정크기의 메모리를 할당해 놓고 그 이상의 값들이 추가되면 새로운 더 큰 메모리를 할당한다.*1

List는 값을 넣을때마다 메모리를 할당하게 된다.

Vector는 메모리 할당을 매번 하지 않기 때문에 매번 할당하는 List보다 pushback이 빠르다.

중간에 추가하는 Insert의 경우 Vector는 배열을 계속 재구성 해야하기 때문에 속도가 느리다.

 

 

 2. 메모리 해제

Vector는 값을 삭제하더라도 메모리 해제를 하지 않는다. 심지어 Clear를 하더라도 메모리는 그대로 남게 된다.

반대로 List의 경우 변수가 해제 될때마다 메모리에서 해제하게 된다.

할당과 마찬가지로 해제또한 popback의 경우 vector가 훨씬 빠르다.

하지만 역시 중간에 값을 삭제하는 것은 List가 더 빠르다.

Vector는 변수들을 삭제할 때 메모리 해제가 되지 않는다. 심지어 Clear함수를 사용해도 메모리는 그대로 남아있다.

 

Vector의 메모리를 해제 하는 함수

Visual Studio 2010 버전 이상 (C++11)

값들의 개수에 맞춰 메모리를 다시 할당하는 함수로 shrink_to_fit() 맴버 함수가 있다.

Visual Studio 2008 버전 이하는 함수를 만들어야 함

template <class T>

void vector_clear(vector<T>& vecObj)

{

vector<T> tempObj;

tempObj.swap(vecObj);

}

* vector의 메모리를 해제해주는 것은 상당히 많은 시간을 소요하므로 특별한 경우만 사용해야한다.  capacity()맴버함수는 현재 할당된 크기를 반환 한다.

 

 3. 메모리 사용량

Vector의 경우 연속적인 주소에 할당 되므로 추가적인 linked list처럼 next의 주소등 다른 변수들을 가지고 있을 필요가 없다.

따라서 Vector가 list보다 적은 메모리를 사용한다. 하지만 Vector도 일정 크기 이상이 넘어가면 오류가 발생 한다.

(vector는 최대 크기가 정해져 있다. 32bit 내 컴퓨터 기준으로 10억개, max_size()맴버함수로 알 수 있다.)

 

 

** 정리

맨뒤에 추가 삭제가 일어나는 경우는 vector가 빠르며 메모리도 적게 먹는다.

따라서 순서와 상관없거나 순차적으로만 추가, 삭제되는 데이터는 vector를 쓰는게 좋다.

순서가 중요하여 리스트의 중간위치에 값이 추가, 삭제가 되는 경우 list를 사용하는 것이 좋다. (메모리는 더 먹지만 속도가 빠르다)

vector는 이제까지 사용했던 가장 많은 크기의 메모리를 사용하므로 주의해야한다.

 

 

실제 게임에서 활용

벡터

- 예를 들어서 액션 관련 정보가 있다.

   이 정보들은 바뀔 경우가 거의 없다.

   읽고 쓰면 되니 이런 경우는 벡터에 저장하면 될 듯 싶다.

리스트

-

'Programing > 자료구조' 카테고리의 다른 글

stl의 list 만들어 보기  (0) 2012.05.30
Big - O 표기법  (0) 2012.05.18
Posted by 부우산사나이
: