코딩/알고리즘 & 자료구조

내가 사용하는 STL (3) - 벡터 (vector)

stonejjun 2020. 7. 15. 22:30

Vector

C++을 사용하게 되면 정말 많이 사용하게 되는 자료구조(?)인 벡터이다. 배열을 사용하는 만큼 정말 많이 사용한다. 배열에서 가능한 모든 연산을 할 수 있으며 추가로 몇 가지 연산들을 더 할 수 있다. 하지만 1-based index를 사용하는 입장으로써는 몇 가지 상황이 아니면 그냥 배열을 사용한다.

문법

많이 사용하는 문법

vector<ll> v ll 형식의 vector v 생성. (아무것도 안 들어있는 상태)
vector<ll> v[303030] ll 형식의 vector 로 이루어진 배열 v 생성.
v[i] v의 i번째 원소 참조. 이때 v의 크기는 i+1이상이어야 한다.
v.push_back(x) v의 마지막에 원소 x 삽입
v.emplace_back(a,b,c) 원래는 구조체등의 다 원소 개체를 넣으려면 중괄호가 필요하지만 emplace_back은 필요하지 않다. 
v.pop_back() v의 마지막 원소 삭제
v.size() v의 크기 반환
v.empty() v가 비어있는지 반환
v.clear() v에 들어있는 모든 원소 삭제
swap(v1,v2) v1과 v2 교체
for(auto k:v) for 문 안에서 k는 v의 각 원소가 차례대로 된다. 
v.begin() 첫 원소를 가르키는 위치 참조
v.end() v의 끝을 가르키는 위치 참조
sort(v.begin(),v.end()) v의 원소들을 이미 있는 정렬기준을 바탕으로 정렬
sort(v.begin(),v.end(),cmp) cmp라는 정렬 기준 함수를 바탕으로 v의 원소들을 정렬
unique(v.begin(),v.end()) 정렬이 되어있는 v에서  그 정렬된 순서를 바탕으로 앞에 원소가 하나씩 나타나며, 반환값은 그 바로 뒤의 위치를 반환한다. 벡터의 나머지 공간은 종류별로 하나씩 뽑아내고 나머지 원소들이 채워지게 된다. 
v.erase(s,e) v에서  [s,e)의 모든 원소를 제거

 

잘 안쓰는 문법

vector<ll> v(n) 크기 n짜리의 벡터 v 생성
vector<ll> v(n,x) 크기 n짜리의 벡터 v 생성
v1.swap(v2) swap(v1,v2)와 동일
v.resize(n) v의 크기를 다시 n으로 만듬
v.capacity() v에 할당된 메모리의 크기 반환
reverse(v.begin(),v.end()) v의 원소의 순서를 거꾸로 뒤집음

Vector의 사용

위에서 언급했듯이 1-index를 사용하는 입장에서는 딱히 별다른 이유가 없으면 익숙한 배열을 쓰게 된다, 하지만 index가 굳이 의미가 없거나 0-index가 편한 인접 행렬, 좌표 압축 등을 할 때에는 vector을 사용한다. 
특히 인접행렬의 경우에 2차원 벡터는 거의 만들지 않고 vector<ll>v[303030]; 과 같이 벡터로 이루어진 배열을 만든 후에, 인접 행렬을 만들고, 그래프 탐색을 할 때 for(auto k:v[i])를 사용한다. 
for(auto k:v)는 정말 편리하고 유용하게 사용된다. 문제들 중에 구한 답 들의 개수와 그 각 답들을 출력하는 문제가 있으면, 보통 vector을 사용하여 담아두고, size를 출력하고 for(auto k:v)를 이용하여 k를 하나씩 출력하면 된다. 이때 k는 v의 형식에 맞춰진 auto 이기 때문에 pair면 pair, 구조체면 구조체 등 다양한 개체가 될 수 있다.