[스퀀스 컨테이너] vector

seio·2022년 10월 2일
0

C++ STL

목록 보기
6/17

배열 기반 컨테이너이므로 원소가 하나의 메모리 블록에 할당된다.

템플릿 형식

template<typename T, typename Allocator = allocator<T>>
class vector

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==v2v1과 v2의 모든 원소가 같은가? (bool 형식)
v1!=v2v1과 v2의 모든 원소 중 하나라도 다른 원소가 있는가? (bool 형식)
v1<v2원소를 하나씩 순서대로 비교하여 v2가 v1보다 큰가? (bool 형식)
v1<=v2v2가 v1보다 크거나 같은가? (bool 형식)
v[i]v의 i번째 원소를 참조한다

템플릿 멤버 형식

설명
allocator_type메모리 관리자 형식
const_itoratorconst 반복자 형식
const_pointerconst value_type* 형식
const_referenceconst value_type& 형식
const_reverse_iteratorconst 역 반복자 형식
difference_type두 반복자 차이의 형식
iterator반복자 형식
pointervalue_type* 형식
referencevalue_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 멤버 함수이다. 두 인터페이스의 기능은 같지만

  • []연산자는 범위 점검을 하지 않아 속도가 빠르다
  • at() 멤버 함수는 범위를 점검하므로 속도는 느리지만 안전하다
profile
personal study area

0개의 댓글