프로그래밍/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가 됨