C++로 코딩 테스트를 준비하다 보면 가장 많이 사용하게 되는 class 인 Vector.
이 Vector 만 잘 사용해도 어지간한 문제들은 다 헤쳐나갈 수 있다.
Why Vector?
벡터의 장점을 꼽자면 대표적으로는 가변적인 배열이다.
값을 입력받아 이에 맞는 배열을 생성해 문제를 풀어가야 하는 대부분의 경우,
흔히 사용하게 되는 배열(Array) 은 적합하지 않다.
따라서 인자에 따라 크기가 동적으로 변할 수 있는 Vector를 사용하게 된다.
하지만, 장점이 있다면 단점도 있는 법인데, 속도적인 측면에서는 배열보다 느리고(1) ,
빈번하게 수정이 일어나면 메모리 재할당을 매번 반복해주어야 하기 때문에 부하가 올 수 있다(2).
Tip(!) - 대부분의 경우에는 vector를 사용하겠지만 , 일부러 에러가 나지 않도록 배열의 크기를 크게 잡아 배열을 사용하는 경우도 있다.
Vector의 생성
헤더파일 : #include <vector>
- vector <int> v;
- 비어있는 vector v를 생성
- vector <int> v(3);
- 기본값(0)으로 초기화된 3개의 원소를 가지는 vector v를 생성합니다.
- vector <int> v(3, 4);
- 4로 초기화된 3개의 원소를 가지는 vector v를 생성합니다.
- 이렇게 새로운 vector는 힙의 영역에 생성된다.
Vector의 함수
- v.at(idx);
- idx번째 원소를 참조합니다.
- v[idx] 보다 속도는 느리지만, 범위를 점검하므로 안전하다고 한다.
- v[idx];
- idx 번째 원소를 참조합니다.
- 범위를 점검하지 않으므로 속도가 v.at(idx)보다 빠르다.
- 보통 이걸 더 많이 사용하는것 같다.
- v.front();
- 첫번째 원소를 참조한다.
- v.back();
- 마지막 원소를 참조한다.
- v[v.size()-1] 같은 눈물겨운 코드는 사용하지 말자...
- v.push_back(3);
- 마지막 원소 뒤에 원소 3을 삽입한다.- 벡터에 원소를 넣을 때 일반적으로 사용하는 함수
- v.pop_back();
- 마지막 원소를 제거한다.
- 스택의 그것과 비슷한 함수
- v.begin();
- 첫 번째 원소를 가리킨다. (iterator와 사용)
- v.end();
- 마지막 원소가 아닌 마지막 원소의 다음을 가리킨다.(일반적인 원소배열에 사용 X)(iterator와 사용)
- v.rbegin();
- reverse begin을 가리킨다 (거꾸로 해서 첫번째 원소를 가리킨다) (iterator와 사용)
- 그렇다면 end()와 같은 것이 아닌가 착각할 수 엄연히 다르다!
- v.rend();
- reverse end를 가리킨다 (거꾸로 해서 마지막의 다음을 가리킨다) (iterator와 사용)
- 그렇다면 begin()과 같은 것이 아닌가 착각할 수 있겠지만 다르다!
Tip(!)
sort(v.begin(), v.end()) 시에는 오름차순으로 정렬이 되지만,
---(기본 sort는 오름차순 정렬이기 때문에)
sort(v.rbegin(), v.rend()) 시에는 내림차순으로 정렬이 된다.
---(rbegin으로 시작한 오름차순 정렬 -> 반대방향에서 시작한 오름차순 정렬 -> 정방향으로 보면 내림차순)
sort(v.end(), v.begin()) 시에는 에러가 뜬다.
---(end()는 마지막 원소가 아닌 마지막원소의 다음을 말한다. + sort()는 first iterator를 원한다.)
- v.size();
- 원소의 개수를 리턴한다.
- v.capacity();
- 할당된 공간의 크기를 리턴한다.
- v2.swap(v1);
- v1과 v2의 원소와 capacity 바꿔줍니다. (모든 걸 스왑 해줌)
- v.insert(3, 4);
- 3번째 위치에 4의 값을 삽입한다.
- 리턴값으로 삽입한 곳의 iterator를 반환한다.- 자동으로 뒤의 원소들은 밀린다. 때문에 벡터의 크기가 크면 클수록 시간이 걸려서 자제하는 게 좋다.
- v.erase(iter);
- iter 가 가리키는 원소를 제거한다.
- v.empty()
- vector가 비었으면 리턴 true (capacity기준이 아닌 size기준으로 비교한다.)
- v.size()==0과 같은 슬픈 코드는 짜지 말자...
참조 : https://cplusplus.com/reference/vector/vector/vector/