배열 기반 컨테이너이므로 원소가 하나의 메모리 블록에 할당된다.
template<typename T, typename Allocator = allocator<T>>
class vector
설명 | |
---|---|
vector v | 빈 컨테이너 |
vector v(n) | 기본값으로 초기화된 n개의 원소를 갖는다 |
vector v(n,x) | x 값으로 초기화된 n개의 원소를 갖는다 |
vector v(v2) | v2 컨테이너의 복사본이다. |
vector v(b,e) | 반복자 구간 [b,e]로 초기화된 원소를 갖는다 |
설명 | |
---|---|
v.assign(n,x) | x값으로 n개의 원소를 할당한다 |
v.assign(b,e) | 반복자 구간 [b, e]로 할당한다 |
v.at(i) | i번 째 원소를 참조한다 (const, 비 const 버전이 있으며 범위 점검을 포함) |
v.back() | 마지막 원소를 참조한다 |
p=v.begin() | 첫 원소를 가르키는 반복자(const, 비const 버전이 있음) |
x=v.capacity() | 할당된 공간의 크기 |
v.clear() | 모든 원소를 제거한다 |
v.empty() | 비어있는지 조사한다 |
p=v.end() | v의 끝을 가르키는 반복자(const, 비const 버전이 있다) |
q=v.erase(p) | p가 가르키는 원소를 제거한다. q는 다음 원소를 가르킨다 |
q=v.erase(b,e) | 반복자 구간 [b, e]의 원소를 제거한다. q는 다음 원소 |
v.front() | 첫번째 원소를 참조한다(const, 비const 버전이 있다) |
q=v.insert(p,x) | p가 가르키는 위치에 x값을 삽입한다. q는 삽입한 원소를 가리키는 반복자다 |
v.insert(p,n,x) | p가 가르키는 위치에 n개의 x값을 삽입한다 |
v.insert(p,b,e) | p가 가르키는 위치에 반복자 구간 [b,e]의 원소를 삽입한다 |
x=v.max_size() | x는 v가 담을 수 있는 최대 원소의 개수이다. (메모리 크기) |
v.pop_back() | 마지막 원소 제거 |
v.push_back(x) | 끝 위치에 x 값 추가한다 |
p=v.rbegin() | p는 v의 역순차열의 첫 원소를 가리키는 반복자다. (const, 비 const 버전이 있음) |
p=v.rend() | p는 v의 역 순차열의 끝을 표식하는 반복자다.(const, 비 const 버전이 있음) |
v.reserve(n) | n개의 원소를 저장할 공간을 예약한다 |
v.resize(n) | v의 크기를 n으로 변경하고 확장되는 공간의 값을 기본값으로 초기화한다 |
v.resize(n,x) | v의 크기를 n으로 변경하고 확장되는 공간의 값을 x 값으로 초기화한다 |
v.size() | v 원소의 개수 |
v1.swap(v2) | v1과 v2를 swap한다 |
설명 | |
---|---|
v1==v2 | v1과 v2의 모든 원소가 같은가? (bool 형식) |
v1!=v2 | v1과 v2의 모든 원소 중 하나라도 다른 원소가 있는가? (bool 형식) |
v1<v2 | 원소를 하나씩 순서대로 비교하여 v2가 v1보다 큰가? (bool 형식) |
v1<=v2 | v2가 v1보다 크거나 같은가? (bool 형식) |
v[i] | v의 i번째 원소를 참조한다 |
설명 | |
---|---|
allocator_type | 메모리 관리자 형식 |
const_itorator | const 반복자 형식 |
const_pointer | const value_type* 형식 |
const_reference | const value_type& 형식 |
const_reverse_iterator | const 역 반복자 형식 |
difference_type | 두 반복자 차이의 형식 |
iterator | 반복자 형식 |
pointer | value_type* 형식 |
reference | value_type& 형식 |
reverse_iterator | 역반복자 형식 |
size_type | 첨자[index]나 원소의 개수 등의 형식 |
value_type | 원소의 형식 |
// 변경 전
for(int i=0; i<v.size();i++){
cout<<v[i]<<endl;
}
--------------------------------------------------------
// 변경 후
for(vector<int>::size_type i =0; i<v.size();i++){
cout<<v[i]<<endl;
}
변경 전 코드는 컴파일러 경고가 출려된다. 이유는 i<v.size()에서 i는 int 타입이지만 size()는 unsigned int 타입을 반환하기 때문이다. i를 unsigned int 타입으로 변환하거나 v.size()를 int 타입으로 변환하면 경고는 없어지지만 이보다 좋은 코드는 vector 내에 typedef된 멤버 형식을 사용하는 것이다.
변경 후 코드는 size_type는 원소의 개수나 [] 연산자등의 index로 사용하는 형식의 typedef된 멤버 형식을 사용하였다.
cout<<typeid(vector<int>::size_type).name()<<endl;
typeid(T): T에 대한 typeinfo 객체를 리턴한다
vector는 배열 기반 컨테이너이면서 원소를 컨테이너에 계속 추가할 수 있다.
배열 기반 컨테이너이므로 연속한 메모리를 한 번에 할당하지만, 계속 원소가 추가될 수 있게 해야하므로 원소가 추가될 때마다 메모리를 초과되면 메모리 재할당해야 한다. 원소가 추가될 때마다 메모리 재할당하고 이전 원소를 모두 복사하면 비용이 커지므로 비효율적이다.
이때 조금이나마 재할당에 드는 성능 문제를 보완하고자 만들어진 개념이 capacity이다.
원소가 추가될 때마다 메모리 재할당하지 않고 미리 넉넉한 메모리를 확보하면 재할당과 이전 원소를 복사하는데 드는 비용을 줄일 수 있다.
이는 컨테이너 중 vector만이 가지고 있는 중요한 특징이다.
vector<type>().swap(v);
clear()를 사용할 경우 벡터가 갖고 있는 원소 값이 제거되지만 메모리는 남아있다. 따라서 위의 코드처럼 메모리를 삭제하고 empty()로 벡터가 메모리가 비어있는지 검사할 수 있다.
임의 위치의 원소를 참조하는 두 인터페이스는 [] 연산자와 at 멤버 함수이다. 두 인터페이스의 기능은 같지만