vector 컨테이너는 STL의 sequence container 중에 정말 자주 쓰게되는 컨테이너중 하나인데 자동으로 메모리가 할당되는 배열이라고 생각하면 된다.
데이터 타입은 마음대로 넣을 수 있고 대략적으로 배열의 맨 뒷쪽에 push_back()과 pop_back()으로 삽입 삭제를 하는 기능을 주로 사용하게 된다.
물론 중간의 값을 삽입하거나 삭제할 수도 있지만 배열기반이므로 삽입 삭제가 빈번하게 일어나된다면 비효율적이게 된다.
1 2 3 4 5 6 7 8 9 10 | #include <vector> using namespace std; int main(void) { vector<int> v; vector<string> v; } | cs |
vector를 사용하기위해선 우선 #include <vector>를 통해 헤더파일을 추가해야하고 using namespace std;를 해주면 편리하다.
vector의 선언은 “vector <data type> 변수이름” 형식으로 해주면 된다.
vector의 생성자와 연산자에 대해 정리해보자면
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | vector<int> v; // 비어있는 vector v를 생성 vector<int> v(10); // 기본값(0)으로 초기화 된 10개의 원소를 가지는 vector v를 생성 vector<int> v(10, 5); // 5로 초기화된 10개의 원소를 가지는 vector v를 생성 vector<int> v1(10, 5); vector<int> v2(v1); // v2는 v1 vector를 복사해서 생성 vector<int> v1; vector<int> v2; // 가 있고 내부에 인자들이 있다고 했을때 연산자 : “==”, “!=”, “<“, “>”, “<=”, “>=” 로 대소비교 가 가능 | cs |
위와 같고 vector의 멤버 함수에 대해 정리해보자면
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 | vector<int> v; v.assign(10, 5); // 5의 값으로 10개의 원소 할당 v.at(idx); // idx번째 원소를 참조 // v[idx] 보다 속도는 느리지만 범위를 점검하므로 안전함 v[idx]; // idx 번째 원소를 참조 // 범위를 점검하지 않으므로 속도가 v.at(idx)보다 빠름 v.front(); // 첫번째 원소를 참조 v.back(); // 마지막 원소를 참조 v.clear(); // 모든 원소를 제거 // 원소만 제거하고 메모리는 남아있음 // size만 줄어들고 capacity는 그대로 남아있음 v.push_back(5); // 마지막 원소 뒤에 원소 5을 삽입 v.pop_back(); // 마지막 원소를 제거 v.begin(); // 첫번째 원소를 가리킴 (iterator와 사용) v.end(); // 마지막의 “다음”을 가리킴 (iterator와 사용) v.rbegin(); // reverse begin을 가리킴 (거꾸로 해서 첫번째 원소를 가리킴) // iterator와 사용 v.rend(); // reverse end 을 가리킴 (거꾸로 해서 마지막의 다음을 가리킴) // iterator와 사용 v.reserve(n); // n개의 원소를 저장할 위치를 예약 (미리 동적할당) v.resize(n); // 크기를 n으로 변경 // 더 커졌을 경우 default값인 0으로 초기화 v.resize(n,5); // 크기를 n으로 변경 // 더 커졌을 경우 인자의 값을 5으로 초기화 v.size(); // 원소의 갯수를 리턴 v.capacity(); // 할당된 공간의 크기를 리턴 // 공간 할당의 기준은 점점 커지면서로 capacity를 할당 v2.swap(v1); // v1과 v2의 원소와 capacity 바꿔줌 (모든걸 스왑해줌) // v1의 capacity를 없앨때 (할당한 메모리를 프로그램이 끝나기 전에 없애고 싶을때) 사용하기도 함 // v2를 capacity가 0인 임시 객체로 만들어서 스왑 // vector<int>().swap(v1); v.insert(2, 3, 4); // 2번째 위치에 3개의 4값을 삽입 (뒤에 값들은 뒤로 밀림) v.insert(2, 3); // 2번째 위치에 3의 값을 삽입 // 삽입한 곳의 iterator를 반환 v.erase(iter); // iter 가 가리키는 원소를 제거 // size만 줄어들고 capacity(할당된 메모리)는 그대로 남음 // erase는 파라미터 하나를 받을때와 두개를 받을 때 다름 v.empty() // vector가 비었으면 리턴 true // 비어있다의 기준은 size가 0이라는 것이지 capacity와는 상관이 | cs |
위와 같다.
여기서 size와 capacity를 잘 구분해야 하는데 size가 원소의 개수를 리턴해주는 것이고 capacity는 할당된 메모리의 크기를 리턴한다.
vector의 멤버 형식으론 iterator(반복자 형식), reverse_interator(역 반복자 형식), value_type(원소의 형식), size_type(원소의 개수의 형식)있다.
아래는 vector를 이용한 반복문 예시이고
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 | #include<iostream> #include<vector> using namespace std; int main(void){ vector<int> v; v.push_back(17); v.push_back(24); v.push_back(31); v.push_back(38); v.push_back(45); //멤버형식 size_type 이용한 반복 cout << “[v.at(i)] size_type : “ ; for(vector<int>::size_type i =0; i<v.size(); i++){ cout << v.at(i) << ” “; } cout << endl; cout << “[ v[i] ] size_type : “ ; for(vector<int>::size_type i =0; i<v.size(); i++){ cout << v[i] << ” “; } cout << endl << endl; //int i 를 이용한 반복 cout << “[v.at(i)] int : “ ; for(int i =0; i<v.size() ; i++){ cout << v.at(i) << ” “; } cout << endl; cout << “[ v[i] ] int : “ ; for(int i =0; i<v.size() ; i++){ cout << v[i] << ” “; } cout << endl << endl; //반복자 iterator를 이용한 반복 cout << “[*iter] iterator : “; vector<int>::iterator iter; for(iter = v.begin(); iter != v.end() ; iter++){ cout << *iter << ” “; } cout << endl << endl; return 0; } | cs |
아래는 참조, 삽입, 삭제, size 예시이다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 | #include<iostream> #include<vector> #include<string> using namespace std; int main(void){ vector<string> v; v.push_back(“Let’s”); v.push_back(“in”); v.push_back(“Coder”); v.push_back(“Blog”); v.push_back(“Community”); //v.front(), v.back() cout << “v.front(), v.back()” << endl; cout << “v.front() : “ << v.front() << endl; cout << “v.end() : “ << v.back() << endl; cout << endl; //v.popback() cout << “v.popback()” << endl; vector<string>::iterator iter; for(iter = v.begin(); iter != v.end() ; iter++){ cout << *iter << ” / “ ; } cout << endl; v.pop_back(); for(iter = v.begin(); iter != v.end() ; iter++){ cout << *iter << ” / “ ; } cout << endl; cout << endl; //v.erase(iter); cout << “//v.erase(iter)” << endl; for(iter = v.begin(); iter != v.end() ; iter++){ if(*iter == “Coder”){ v.erase(iter); break; } } for(iter = v.begin(); iter != v.end() ; iter++){ cout << *iter << ” / “ ; } cout << endl << endl; //v.size(), v.capacity(); cout << “v.size(), v.capacity()” << endl; cout << “v.size() : “ << v.size() << endl; cout << “v.capacity() : “ << v.capacity() << endl; return 0; } | cs |