블링블링 범블링

[자료구조] 벡터(vector) 본문

알고리즘 문제풀이/자료구조 및 알고리즘

[자료구조] 벡터(vector)

뻠스키 2018. 5. 1. 13:10

벡터(vector)


벡터는 배열과 비슷하다. vector stl를 사용하는 이유는 여러가지가 있겠지만 배열보다 몇가지 이점이 있기 때문에 사용한다. 물론 벡터와 배열 장단점이 있기 때문에 필요에 따라 사용하는 것이 좋다.


1. 가변배열이기 때문에 메모리를 효율적으로 사용할 수 있다. (배열과의 차이점)



기존의 배열은 크기를 정하고 선언하게 된다. 하지만 만약에 그 공간을 다 사용하지 않는 경우에는 메모리가 낭비 될 수도 있다. 물론 크게 남는게 아니라면 엄청난 낭비는 아닐 것이다. 

내가 처음 벡터의 개념을 접했을 때 배열 크기에 제한을 받지 않고 데이터를 저장할 수 있어서 무한한 바구니 같다는 느낌이 들었다. 특정 기준으로 데이터집합이 필요한 경우에는 벡터를 사용한다.


2. 중간 데이터를 순차적 접근을 통해 얻지않아도 된다.(리스트와 차이점) 


이번에는 리스트와 비교를 해보면 리스트는 벡터처럼 동적할당을 할 수 있다는 점이 같다.

다른 점은 리스트는 중간의 데이터삽입과 삭제가 가능하지만 벡터는 그렇지 못하다. 

하지만 index를 가지고 있기 때문에 중간 특정idx에 접근하고자 하면 바로 접근이 가능하다. 반대로 리스트는 순차적 접근으로 특정 idx에 접근이 가능하다. 각각의 장단점이 있기 때문에 필요에 따라 자료구조를 선택하면 된다. 



[벡터 stl 사용법]


<소스코드>

template<typename T>
class _vector {
public:
int capacity, _size;
T *arr;
_vector() {
capacity = 4;
_size = 0;
arr = new T[capacity];
}
void resize(int n) {
T *temp = new T[n];
for (int i = 0; i < _size; i++)temp[i] = arr[i];
delete arr;
arr = temp;
}
void push_back(T data) {
if (_size == capacity) {
capacity *= 2;
resize(capacity);
}
arr[_size++] = data;
}
int size() {return _size;}
T* begin() {return &arr[0];}
T* end() {return &arr[0] + _size;}
void clear() {
capacity = 4;
_size = 0;
delete arr;
arr = new T[4];
}
T operator [](int idx) {
return arr[idx];
}
};
view rawvectorSTL.cpp hosted with ❤ by GitHub



[resize()]

이 함수는 기존의 배열 사이즈를 2배로 키워주는 기능을 한다. 가변배열이기 때문에 데이터 공간의 필요에 따라 배열 크기를 키운다.


[push_back(T data)]

이 함수는 데이터를 삽입하는 기능을 한다. 한번 호출 할 때마다 가장 마지막 위치에 데이터를 삽입한다. 중간에 데이터를 삽입할 수는 없다.


[size()]

이 함수는 벡터의 배열 사이즈를 알려준다.

vector <int> v;한 뒤에 v.size();라고 출력하면 배열 사이즈를 알 수 있다.


[begin()]
이 함수는 벡터 배열의 가장 앞의 데이터를 반환하는 함수다. 

[end()]
이 함수는 벡터 배열의 가장 뒤의 데이터를 반환하는 함수다. arr[0]째는 배열 주소를 가리키기 때문에 +size를 해주면 가장 마지막 데이터를 반환할 수 있다.

[clear()]
이 함수는 기존의 배열을 전부 삭제하는 기능을 지닌다. 필요가 없어지는 경우에는 clear();를 사용해 초기화를 시켜준다.

[operator [](int idx)]

이 함수는 idx번 째의 데이터를 반환해주는 기능을 한다. 특정 idx의 데이터 접근이 가능하기 때문에 배열처럼 곧바로 데이터 참조가 가능하다.


Comments