C++프로그래밍/자료구조,알고리즘(추후확장)

vector의 동작 원리(size / capacity)

season97 2024. 9. 28. 11:26

※ C / C++을 이미 알고 있으나 개인적인 공부를 위해 포스팅 하는 글이므로

C++에 대한 구체적인 정보를 담고 있지 않습니다.


 

 

vector는 한마디로 동적배열

 

 

vector의 동작 원리(size / capacity)

중간 삽입/삭제

처음/끝 삽입/삭제

인덱스 접근

더보기

# 배열의 단점?

   const int MAX_SIZE = 10;
   int arr[MAX_SIZE] = {};
   for (int i = 0; i < MAX_SIZE; i++)
   {
       arr[i] = i;
   }
   for (int i = 0; i < MAX_SIZE; i++)
   {
       cout << arr[i] << endl;
   }

ㆍ 크기가 정적임

 

# vector 

vector<int> v;

ㆍ 간단한 선언 방법.

 

★특성

1) 메모리를 처음 할당할 때 여유분을 두고 메모리를 할당한다.

# 여유분은 얼만큼이 적당할까?? 

# 증설을 얼만큼 해야할까?? 

  vector<int> v;
  for (int i = 0; i < 1000; i++)
  {
      v.push_back(100);

      cout << v.size() << "  " << v.capacity() << endl;
  }
  int a = v.size();
  int b = v.capacity();

ㆍ size와 capacity를 찍어보면 크기가 다르다.

size는 실제 사용 데이터 개수

capacity는 여유분을 포험한 용량 개수이다

 

 

2) 여유분까지 꽉 찼으면, 메모리를 증설한다.

※ 기존에 데이터를 어떻게 처리할까?

 

# 메모리가 가득 찼을 때 이 전의 메모리를 삭제하고 원소를 복사 한 뒤 메모리를 재할당 하는 방식을 채택

ㆍ 이 복사가 일어나면 낭비가 일어날 수 있겠다. 복사 횟수를 줄이기 위해 여유분을 충분히 두는게 좋겠다.

 


# 극한의 누수를 막는다면 reserve키워드로 메모리를 더 아낄 수 있지않을까? 

ㆍ reserve를 사용하면 처음부터 용량이 그만큼으로 되어있다. 근데 이 용량이 초과해도 어처피 capacity는 늘어난다.

 


# resize를 활용하면 데이터가 어떻게 되는걸까?

ㆍ resize는 1000개의 사이즈가 이미 할당되는 것이고 (사용되는 것) push_back으로 밀어주면 1001번째부터 쌓인다.

ㆍ 뭐... 굳이 사용하고싶으면v[i]로 접근하면 되긴 한다. 

  vector<int> v(1000, 0);
  vector<int> v2 = v;

ㆍ 첫째줄 코드는 resize와 같은 말이다. 

 


# v.clear() 를 하면 어떻게될까?

ㆍ 데이터는 싹 밀어줬지만 용량은 그대로 남아있는 모습이다.

ㆍ 아니 그럼 capacity까지 밀어버리고싶으면 어떻게해??

 v.clear();
 vector<int>().swap(v);

ㆍ 이렇게하면 두번째 벡터는 임시벡터. 얘는 생명주기 끝나면 소멸된다.

 


 

 

'C++프로그래밍 > 자료구조,알고리즘(추후확장)' 카테고리의 다른 글

vector의 삽입삭제, 인덱스접근  (1) 2024.09.28
vector와 iterator  (1) 2024.09.28
콜백함수  (0) 2024.09.27
클래스 템플릿  (0) 2024.09.27
템플릿 기초 (함수템블릿)  (0) 2024.09.27