프로그래밍/C,C++
[C/C++] STL Vector 사용법
노력의천재
2020. 5. 8. 00:38
Vector
배열과 거의 동일한 기능을 수행하는 자료구조
배열과 마찬가지로 원소가 메모리에 연속하게 저장되어 있기 때문에 O(1) 시간으로 원소에 접근 가능
배열과 다르게 크기를 자유자재로 늘이거나 줄일 수 있다는 장점이 있음 => 가변 배열
그래프의 인접리스트를 구현할 때 많이 사용
vector<int> a;
비어있는 벡터 a 생성
vector<int> a(10);
0으로 초기화 된 크기가 10인 벡터 a 생성
vector<int> a(10,1);
1로 초기화 된 크기가 10인 벡터 a 생성
vector<vector<int> > a;
비어있는 2차원 벡터 a 생성
vector<vector<int> > a(10, vector<int>(10));
0으로 초기화 된 10x10 2차원 벡터 a 생성
vector<vector<int> > a(10, vector<int>(10,1));
1로 초기화 된 10x10 2차원 벡터 a 생성
vector<int> a[10]
0으로 초기화 된 벡터 배열 a 생성 // a[0], a[1], a[2] ... a[9]
vector<pair<int, int> > g[3]
0으로 초기화 된 페어형 벡터 배열 g 생성
// g[0].push_back({3,5}); == g[0].push_back(make_pair(3,5));
// g[0][0].first == 3
// g[0][0].second == 5
a[0]=make_pair(3,1);
pair형 벡터의 원소를 추가하는 다른 방법
a.front();
첫번째 원소를 참조
a.back();
마지막 원소를 참조
a.clear();
모든 원소를 제거(메모리는 남아있음)
a.push_back(5);
마지막 원소 뒤에 5를 삽입
a.pop_back();
마지막 원소를 제거
a.begin();
첫번째 원소를 가리킴(pointer/iterator)
a.end();
마지막 원소를 가리킴(pointer/iterator)
a.erase(a.begin());
첫번째 원소 제거
a.erase(a.end());
마지막 원소 제거
a.size();
벡터의 크기(원소의 개수)를 리턴
a.capacity();
할당된 공간의 크기를 리턴
a.empty();
벡터가 비어있으면(a.size==0) true를 리턴
a.erase(unique(a.begin(),a.end()),a.end());
중복 제거 (정렬 후 사용 필수!)
*min_element(a.begin(), a.end());
벡터에서 최소값을 리턴
*max_element(a.begin(), a.end());
벡터에서 최대값을 리턴
Vector의 반복문
vector<int> v = {1, 2, 3, 4, 5, 6};
// 1. ranged-based for loop (C++11~)
for(int e : v) {
cout<<e<<" "; // 1 2 3 4 5 6
}
// 2. legacy for loop
for(int i = 0; i < v.size(); i++) {
cout<<v[i]<< " ";
}
// 3. !!!WRONG!!!
for(int i = 0; i < v.size()-1; i++) {
cout<<v[i]<<" ";
}
// 출처 : https://www.youtube.com/watch?v=mBeyFsHqzHg&t=893s
※ 기본적으로 vector의 size() 메소드는 unsigned int를 반환하기 때문에 3번의 경우 v가 빈 벡터일 때, v.size()-1이 unsigned int 0에서 int 1을 빼는 식이 되고, unsigned int와 int를 연산하면 unsigned int로 자동 형변환이 되기 때문에 결과 값이 -1이 아니라 4294967295가 됨