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, 구조체면 구조체 등 다양한 개체가 될 수 있다.
'코딩 > 알고리즘 & 자료구조' 카테고리의 다른 글
내가 사용하는 STL (4) - 덱 (Deque) (0) | 2020.08.06 |
---|---|
내가 사용하는 STL (5) - 우선 순위 큐 (priority queue) (0) | 2020.08.04 |
내가 사용하는 STL (2) - 큐 (queue) (1) | 2020.07.14 |
내가 사용하는 STL (1) - 스택 (stack) (1) | 2020.07.13 |
Segment Tree 심화 (4) - Euler Tour Tree(DFS Numbering Tree) (2) | 2020.07.06 |