벡터의 프로퍼티들은 ptr, size, capacity 등이 스택에 존재한다.

str 은 메모리 주소, size 는 실제 들어가 있는 크기, capacity 는 쉽게 말해 추가될 걸 대비해 넉넉하게 잡아놓은 크기이다.

 

push_back() 의 시간복잡도는 O(1) 이다. 뒤에 넣기만 하면 된다.

push_front() 의 시간복잡도는 O(n) 이다. 모든 데이터를 한칸씩 뒤로 옮긴 다음 첫 공간에 넣어야 하기 때문이다.

pop 도 마찬가지.

 

capacity 는 벡터가 현재 정의된 사이즈 이후에 얼마나 더 정의될 수 있는지에 대한 정보이다.

push back 을 하고 싶은데 만약 바로 뒤에 다른 메모리가 잡혀 있으면 (fragmentation!!)

벡터 전체를 다른 공간에 옮겨야 하기 때문에 O(n) 이 된다. (전부 복사한 다음 기존 메모리를 해제)

 

벡터를 사용하는 이유는 퍼포먼스인데, 이것이 문제가 되면 굳이 사용하는 이유가 없는 것이다.

test_vec.reserve(n);

선언 할 때 처음에 사이즈가 0이더라도 capacity 를 정해준다. 대략적인 capacity 를 reserve 해주는 습관을 들이자

 

push_back() 은 대부분 O(1) 인데, 이렇게 프래그맨테이션이 걸릴 경우엔 O(n) 이 될 수 있다!

 

+ 동적 배열은 웬만해서 vector 를 쓰자!

new 같은 경우는 stl 보다 기능적으로도 떨어지고, 메모리 해제를 직접 해줘야 하기 때문에 메모리 누수의 가능성을 보장받지 않는다.

벡터는 스택에서 해제될 때, 프로퍼티에 존재하는 포인터를 따라가 같이 해제를 시켜준다!

'STUDY > C++' 카테고리의 다른 글

[C++] 키워드 static  (0) 2020.05.26
[C++] list 를 쓸까?  (0) 2020.05.22
[C++] 배열과 벡터?  (0) 2020.05.21
[C++] 헤더파일과 소스파일  (0) 2020.05.17
[C++] 벡터 push() vs emplace()  (0) 2020.05.10

+ Recent posts