\(\texttt{vector}\) Template Class
벡터 템플릿 클래스
- C++98에서 처음으로 고안된 STL로 제공하는 동적 배열을 관리할 때 사용하는 도구이다.
- Homogeneous Container를 제공한다.
- 내부적으로는 new, delete 연산자가 사용된다.
- \(\texttt{<vector>}\) Header File에서 제공된다. (구 \(\texttt{vector.h}\))
- vector 식별자는 \(\texttt{std}\) namespace에 속해있다.
- vector 객체는 값을 삽입하거나 더할 때 자동으로 크기를 조정하며,
크기를 재조정할 때에는 vector 패키지에 포함된 여러 방법들을 사용할 수 있다.
- 내재 배열형과 동일하게, 표준 배열 표기법을 사용할 수 있다.
- 한 프로그램에서,
Built-In Array Type과 \(\texttt{array}\) Template은 Elements들을 동일한 메모리 지역에 저장시키는데 반해,
\(\texttt{vector}\) Template은 Elements들을 Heap에 저장시킨다.
* \(\texttt{allocator}\) Obejct (URL)
- 많은 STL Container Template에서는 효율적인 메모리 관리를 위해 \(\texttt{<memory>}\) Header의
\(\texttt{allocator}\) Object를 상속받아 사용하고 있다.
\(\texttt{vector}\) Usage (\(\texttt{vector}\) 템플릿 클래스 사용법)
- 선언할 \(\texttt{vector}\) Object에 \(\texttt{<type>}\) 표기를 통해 Data Type을 지정할 수 있다.
Example. \(\texttt{vector}\) Object Declaration
#include <vector>
using namespace std;
// 일반형
vector<typeName> vt(n_elem);
// 매개변수 n_elem은 정수형 상수 또는 정수형 변수가 될 수 있다.
// 사용 예시
vector<int> Ex1;
// Integer type의 Zero-Size array "Ex1" 생성
vector<double> Ex2(n);
// Double type의 n-Size array "Ex2" 생성
vector<int> Ex3(n, val);
// val로 초기화 된, Integer type의 n-Size array "Ex3" 생성
vector<double> Ex4(Ex2);
// Ex2를 복사하여 생성된 "Ex4"
- 여기서, Ex1은 "object of type vector<int>" 라고 표현하고, Ex2는 "object of type vector<double>" 라고 표현한다.
- vector 객체는 값을 삽입하거나 더할 때 자동으로 크기를 조정하기 때문에,
Zero-size vector를 선언해도 사용하는 데 문제가 없다.
\(\texttt{vector}\) Methods
Methods | Description |
v.at(index) | - index번째 Element에 접근한다. - 유효하지 않은 Index에 접근할 경우, 해당 접근 연산을 취소시킨다. - 실행 시간을 증가시키지만, Error의 발생 가능성을 낮춘다. * v[index]와 같은 접근은 유효성 검사를 시행하지 않는다. |
v.size() | - 해당 vector 객체가 보유한 Elements의 개수를 리턴한다. |
v1.swap(v2) | - vector 객체 v1과 v2의 Elements들과 Capacity를 서로 맞바꾼다. |
v.begin() | - 첫 번째 Element를 가리키는 iterator를 리턴한다. |
v.end() | - 마지막 Element를 가리키는 iterator를 리턴한다. |
v.assign(n, val) | - val값으로 초기화 된 n개의 Elements를 할당한다. |
v.front() | - 첫 번째 Element의 Reference를 리턴한다. |
v.back() | - 마지막 Element의 Reference를 리턴한다. - Empty Vector에 대해서 back() 함수의 행동은 정의되어 있지 않기 때문에, back() 함수를 사용하려면 empty() 함수값이 true인지를 확인한 후 실행시켜야 한다. |
v.clear() | - 모든 Elements를 제거한다. - size는 줄어들되, capacity는 그대로 유지된다. (즉, 해당 vector 객체에 할당된 메모리의 크기에는 변함이 없다.) |
v.push_back(val) | - 마지막 Element뒤에 val값을 삽입한다. |
v.pop_back() | - 마지막 Element를 제거한다. |
v.rbegin() | - Reverse iterator를 리턴하여 begin()을 수행시킨다. |
v.rend() | - Reverse iterator를 리턴하여 end()를 수행시킨다. |
v.reverse(n) | - n개의 Element를 저장할 메모리 공간을 미리 확보해놓는다. (즉, Size는 증가되지 않고, Capacity를 증가시킨다.) |
v.resize(n) | |
v.resize(n, val) | |
v.capacity() | - Capacity값을 리턴한다. (Capacity값은 기존값에서 두 배씩 증가한다.) |
v.insert(p, n, val) | - p번째 위치에 n개의 val값을 삽입한다. - 이 때, 뒤에있던 Element들은 n만큼 뒤로 밀린다. |
v.insert(p, val) | - p번째 위치에 val을 삽입한다. - 삽입한 위치를 가리키는 iterator를 리턴한다. |
v.erase(iterator) | - iterator가 가리키는 원소를 제거한다. - Size는 감소하지만, Capacity값에는 변함이 없다. |
v.erase(start, end) | - start 이상, end 미만까지의 모든 Element를 제거한다. = [start, end) 영역의 Elements를 제거한다. |
v.empty() | - v의 size 값이 0이면 true를 리턴하고, 그렇지 않으면 false를 리턴한다. |
sort() Function with vector
URL
Reference: C++ Primer Plus 6E (Stephen Prata 저, Pearson, 2012)