백준 문제를 풀다가 어떻게 풀어야할지 생각을 하다가 떠오르는 방법이 모두 마음에 들지 않아서
다른 사람들의 풀이를 보다가 vector를 사용하는 것을 보고 이것이 무엇인지 흥미를 가지게 되었습니다.
vector Container?
- vector 컨테이너는 자동으로 메모리가 할당되는 배열입니다.
- vector를 생성하면 메모리 heap에 생성되며 동적할당됩니다.
- 속도적인 측면에서는 배열에 비해 성능이 떨어지지만 메모리를 효율적이로 관리하고 예외처리가 쉽다는 장점이 있기 때문에 사용을 합니다.
- vector는 배열과 마찬가지로 원소들이 하나의 메모리 블록에 연속되게 저장됩니다.
- 원소가 추가되거나 삽입될 때 메모리 재할당이 발생할 수 있고 상당한 부하가 발생하는것이 단점입니다.
C++의 vector는 C++ 표준라이브러리 STL에 있는 컨테이너로 사용자가 사용하기 편하게 정의된 class를 말합니다.
모든 STL이 그렇듯 template를 사용하기 때문에 데이터 타입은 원하는대로 넣을 수 있습니다.
Vector 사용
- <vector> 헤더파일을 추가합니다.
- 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 |