1. Vector 정의
길이가 변하는 동적 배열로서 객체를 삽입하거나 제거할 때 자동으로 크기가 변한다. 배열 대용으로 사용가능하다.
2. Vector 사용법
#include <vector>
vector <변수 형태> 변수이름
at : 원소에 아이템 접근 읽기 쓰기 가능, 영역 벗어나는지 검사 가능
operator[] : 원소에 아이템 접근 읽기 쓰기 가능
3. 메소드 종류
size() : 저장된 item 갯수 획득
reserve() : 스토리지를 미리 예약한다, 메모리 할당이 한번에 많이 할때 성능을 위해서 사용을 고려가 필요하다.
capacity() : 현재 할당할 수 있는 메모리, 이 양보다 증가되면 신규로 메모리 할당이 일어난다.
clear() : 전체 아이템 삭제
insert() : 특정 위치에 아이템 추가
push_back() : 아이템을 뒤쪽에 추가
erase(iterator) : 아이템 삭제
pop_back() : 마지막 아이템 삭제
전체 목록은 아래 참고
https://en.cppreference.com/w/cpp/container/vector
4. 예제
4.1 아이템 추가 / 접근
단순한 예제입니다. push_back()으로 마지막에 아이템을 추가하고 at() 이나 [] 연산자로 접근이 가능합니다.
#include <iostream> #include <vector> using namespace std; int test1() { vector <int> v; v.push_back(10); v.push_back(20); v.push_back(30); v.at(0) = 40; v[1] = 50; int nsize = v.size(); cout << "size:" << nsize << endl; cout << "v = { "; for (int i=0 ; i < nsize ; i++) { cout << v[i] << ", "; } cout << "};" << endl; return 0; } int main() { test1(); return 0; }
출력
size:3 v = { 40, 50, 30, };
4.2 at / operator[] 차이 및 주의점
at / []의 가장큰 차이점은 at은 boundary 검사를 한다는것입니다. 당연히 속도가 떨어질 가능성이 있겠죠. []은 검사를 하지 않지만 메모리를 잘못 액세스시 어떤일이 벌어질지 그때 그때마다 동작이 다르게 됩니다.
아래 예제를 보면 v[3] = 50; 를 사용하지만 v.size()그대로 3을 유지하고 있습니다. 즉 [] 연산자에 의해서 크기는 전혀 증가가 되지 않습니다. at은 범위를 벗어나면 exception을 일으킵니다.
#include <iostream> #include <vector> using namespace std; int test2() { vector <int> v; v.push_back(10); // index 0 v.push_back(20); // index 1 v.push_back(30); // index 2 cout << "vsize:" << v.size() << endl; v[3] = 50; cout << "vsize:" << v.size() << " v[3]:" << v[3] << endl; v.at(3) = 40; cout << "vsize:" << v.size() << " v[3]:" << v[3] << endl; int nsize = v.size(); cout << "size:" << nsize << endl; cout << "v = { "; for (int i=0 ; i < nsize ; i++) { cout << v[i] << ", "; } cout << "};" << endl; return 0; } int main() { test2(); return 0; }
결과
vsize:3 vsize:3 v[3]:50 terminate called after throwing an instance of 'std::out_of_range' what(): vector::_M_range_check: __n (which is 3) >= this->size() (which is 3)