상세 컨텐츠

본문 제목

<How to 코테 with C++> 1. Vector

코딩테스트

by ArtiOS 2023. 3. 8. 14:53

본문

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/

관련글 더보기