본문 바로가기
백준 문제 풀이 & C++ 공부

C++ Vector Container

by daisy0461 2021. 7. 5.

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

다른 사람들의 풀이를 보다가 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을 사용할 수 있는 문제를 보았는데

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

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

'백준 문제 풀이 & C++ 공부' 카테고리의 다른 글

백준 10814번 C++  (0) 2021.07.07
C++ sort & stable_sort  (0) 2021.07.07
백준 9012 C++ & cin.ignore()  (0) 2021.07.04
백준 10773번 C++  (0) 2021.06.22
백준 7568번 C/C++  (0) 2021.06.21