백준 문제 풀이 & C++ 공부

C++ Vector Container

daisy0461 2021. 7. 5. 17:32

백준 문제를 풀다가 어떻게 풀어야할지 생각을 하다가 떠오르는 방법이 모두 마음에 들지 않아서

다른 사람들의 풀이를 보다가 vector를 사용하는 것을 보고 이것이 무엇인지 흥미를 가지게 되었습니다.

 

vector Container?

  • vector 컨테이너는 자동으로 메모리가 할당되는 배열입니다.
  • vector를 생성하면 메모리 heap에 생성되며 동적할당됩니다.
  • 속도적인 측면에서는 배열에 비해 성능이 떨어지지만 메모리를 효율적이로 관리하고 예외처리가 쉽다는 장점이 있기 때문에 사용을 합니다.
  • vector는 배열과 마찬가지로 원소들이 하나의 메모리 블록에 연속되게 저장됩니다.
  • 원소가 추가되거나 삽입될 때 메모리 재할당이 발생할 수 있고 상당한 부하가 발생하는것이 단점입니다.

C++의 vector는 C++ 표준라이브러리 STL에 있는 컨테이너로 사용자가 사용하기 편하게 정의된 class를 말합니다.

모든 STL이 그렇듯 template를 사용하기 때문에 데이터 타입은 원하는대로 넣을 수 있습니다.

 

 

Vector 사용

  1. <vector> 헤더파일을 추가합니다.
  2. vector의 선언 방법은 vector<data type> [변수명]입니다. -> vector<int> v

 

Vector의 생성자와 연산자

위에서 예시를 들었던 vector<int> v;를 통해 예시를 들어보겠습니다.

  • 생성자
    vector<int> v; 비어있는 vector v를 생성
    vector<int> v(5) 기본값(0)으로 초기화된 5개의 원소를 가지는 vector생성
    vector<int> v(5,2); 2로 초기화된 5개의 원소를 가지는 vector v 생성
    vector<int> v2(v1) v2는 v1을 복사해서 생성

이렇게 생성이 가능합니다.

vector<int> v1; vector<int> v2; 가 있을 때 각 vector의 내부 인자들은 대소비교가 가능합니다.

==, !=, <, >, <=, >=

ex) v1[2] > v2[3]

 

생성에서 하나 더 중요한 점은

메모리 재할당이 발생할 수 있고 상당한 부하가 걸릴 수 있다고 했습니다.

그렇기에 vector의 capacity가 부족하면 capacity/2 만큼 capacity를 늘려가는데 이 과정에서 부하가 걸릴 수 있습니다.

입력이 들어올 원소의 개수를 미리 알고 있다면 미리 capacity를 할당한다면 더욱 효율적으로 vector을 사용할 수 있습니다.

 

vector의 멤버 함수

어떻게 보면 이 멤버 함수를 활용할 수 있어야 제대로 잘 사용을 한다고 볼 수 있습니다!

저도 많이 부족하지만 같이 공부합시다!

v.assing(5, 2); 2라는 값으로 5개의 원소 할당.
v.at(idx); idx번쨰 원소 참조
v[idx]보다 느리지만, 범위를 점검하므로 안전.
v[idx]; idx번째 원소를 참조
범위를 점검하지 않아 속도가 상대적으로 빠름
범위를 점검한다는 이야기는
vector의 크기가 100일때 150번지에 접근을 한다고 할 때
v.at(150);은 에러가 생기고
v[150];은 에러가 생기지 않습니다. 
v.front(); 첫번째 원소를 참조.
v.back(); 마지막 원소를 참조.
v.clear(); vector내의 모든 '원소' 제거
원소만 제거하고 메모리는 남아있음.
size만 줄어들고 capcity는 동일
v.push_back(7); 마지막 원소 뒤에 7을 삽입
v.pop_back(); 마지막 원소를 제거
v.begin(); 첫번쨰 원소를 가리킴.
v.end(); 마지막의 "다음"을 가리킴
v.rbegin(); reverse begin을 가리킨다.
(거꾸로해서 첫번쨰 원소를 가리킴)
iterator와 사용
v.rend(); reverse end를 가리킨다
(거꾸로해서 마지막의 다음을 가리킴)
iterator와 사용
v.reserve(n); n개의 원소를 저장할 위치를 예약
(미리 동적할당을 함)
v.resize(n); 크기를 n으로 변경한다.
크기가 더 커지면 커진만큼 default값인
0으로 초기화
v.resize(n, 3); 크기를 b으로 변경한다.
더 커진 경우 3으로 초기화
v.size(); 원소의 갯수 return
v.capacity(); 할당된 공간의 크기 return
공간 할당의 기준은 점점 커지면서
capacity를 할당
v2.swap(v1); v1과 v2의 원소와 capacity를 바꿈
(모든걸 swap)
v1의 capacity를 없앨때 사용하기도 함
v.insert(2, 3); 2번째 위치에 3을 삽입함.
삽입한 곳의 iterator를 반환
v.empty() vector가 비었으면 true
size와 연관 있음 / capacity와는 연관 X

백준 문제를 풀면서 다양한 vector을 사용할 수 있는 문제를 보았는데

사실 오늘도 블로그 포스팅 하다가 봐서 잘 모르겠어서 포기...

앞으로 잘 활용을 하면서 익숙해져서 원활하게 사용을 할 수 있으면 좋겠습니다.