[스퀀스 컨테이너] deque

seio·2022년 10월 2일
0

C++ STL

목록 보기
7/17

deque 컨테이너는 vector 컨테이너와 기능과 동작이 가장 비슷한 컨테이너로 vector의 단점을 보완하는 몇 가지 특징을 갖는다. deque도 vector와 같이 스퀸스 컨테이너이며 배열 기반 컨테이너이다.

템플릿 형식

설명
template<typename T, typename Allocator = allocator> class dequeT는 deque 컨테이너 원소의 형식

인터페이스

생성자

생성자설명
deque dq빈 컨테이너
deque dq(n)기본값으로 초기화된 n개의 원소를 갖는다
deque dq(n,x)x값으로 초기화된 n개의 원소를 갖는다
deque dq(dq2)dq2 컨테이너의 복사본이다. (복사 생성자 호출)
deque dq(b,e)반복자 구간 [b,e]로 초기화된 원소를 갖는다.

멤버 함수

멤버 함수설명
dq.assign(n,x)x값으로 n개의 원소를 할당한다
dq.assign(b,e)반복자 구간 [b, e]로 할당한다
dq.at(i)i번 째 원소를 참조한다 (const, 비 const 버전이 있으며 범위 점검을 포함)
dq.back()마지막 원소를 참조한다
p=dq.begin()첫 원소를 가르키는 반복자(const, 비const 버전이 있음)
dq.clear()모든 원소를 제거한다
dq.empty()비어있는지 조사한다
p=dq.end()dq의 끝을 가르키는 반복자(const, 비const 버전이 있다)
q=dq.erase(p)p가 가르키는 원소를 제거한다. q는 다음 원소를 가르킨다
q=dq.erase(b,e)반복자 구간 [b, e]의 원소를 제거한다. q는 다음 원소
dq.front()첫번째 원소를 참조한다(const, 비const 버전이 있다)
q=dq.insert(p,x)p가 가르키는 위치에 x값을 삽입한다. q는 삽입한 원소를 가리키는 반복자다
dq.insert(p,n,x)p가 가르키는 위치에 n개의 x값을 삽입한다
dq.insert(p,b,e)p가 가르키는 위치에 반복자 구간 [b,e]의 원소를 삽입한다
x=dq.max_size()x는 dq가 담을 수 있는 최대 원소의 개수이다. (메모리 크기)
dq.pop_back()마지막 원소 제거
dq.pop_front()첫 원소 제거
dq.push_back(x)끝 위치에 x 값 추가한다
dq.push_front(x)첫 위치에 x 값 추가한다
p=dq.rbegin()p는 dq의 역순차열의 첫 원소를 가리키는 반복자다. (const, 비 const 버전이 있음)
p=dq.rend()p는 dq의 역 순차열의 끝을 표식하는 반복자다.(const, 비 const 버전이 있음)
dq.resize(n)dq의 크기를 n으로 변경하고 확장되는 공간의 값을 기본값으로 초기화한다
dq.resize(n,x)dq의 크기를 n으로 변경하고 확장되는 공간의 값을 x 값으로 초기화한다
dq.size()dq 원소의 개수
dq1.swap(dq2)dq1과 dq2를 swap한다

연산자

설명
dq1==dq2dq1과 dq2의 모든 원소가 같은가? (bool 형식)
dq1!=dq2dq1과 dq2의 모든 원소 중 하나라도 다른 원소가 있는가? (bool 형식)
dq1<dq2원소를 하나씩 순서대로 비교하여 dq2가 dq1보다 큰가? (bool 형식)
dq1<=dq2dq2가 dq1보다 크거나 같은가? (bool 형식)
dq[i]dq의 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원소의 형식

deque와 vector 차이점

deque가 vector와 다른 점은 메모리 블록 할당 정책이다.

vector의 장점이자 단점인 하나의 메모리 블록 할당 정책은 배열처럼 정수 연산만으로 원소에 접근하고 원소에 접근하고 빠르게 값을 읽고 쓸 수 있다. 하지만 새로운 원소가 추가될 때 메모리 재할당과 이전 원소 복사 문제가 발생하여 성능이 저하될 수 있다.

deque는 이처럼 vector의 단점을 해결하기 위해 여러 개의 메모리 블록을 할당하고 사용자에게는 하나의 블록처럼 보이게 하는 정책을 사용한다. 원소 추가 시 메모리 부족할 때마다 일정한 크기의 새로운 메모리 블록을 할당하여 이전 메모리 제거하거나 이전 원소를 복사하는 등의 연산을 수행하지 않는다.

deque의 주요 특징

dqque는 스퀀스 컨테이너이며 배열 기반 컨테이너이다. 그래서 vector와 유사한 특징을 가지며 임의 접근 반복자를 지원한다. vector와 다른 점은 원소가 메모리 블록에 연속하게 저장되지만 하나의 메모리 블록이 아닌 여러 메모리 블록에 나뉘어 저장된다는 것이다.

그렇다 보니 deque는 원소를 앞쪽과 뒤쪽에 모두 추가할 수 있으며 배열 기반 컨테이너의 특징을 가지면서도 vector 보다 조금 더 효율적으로 동작한다.

deque는 스퀀스 기반 컨테이너이다. 스퀀스 기반 컨테이너는 원소가 서로 상대적인 위치(순서)를 유지하므로 가장 앞 원소와 가장 뒤 원소를 참조하는 front(), back() 멤버 함수를 제공한다. deque가 스퀀스 기반 컨테이너이므로 insert(), erase() 멤버 함수가 호출되면 삽입, 제거될 위치부터 모든 원소를 밀어내야 한다. 상당히 비효율적으로 동작하지만 vector보다는 조금 더 효율적으로 동작한다. vector는 모든 원소를 뒤쪽으로만 밀어낼 수 있지만 deque는 뒤쪽이나 앞쪽으로 밀어낼 수 있기 때문이다.

마지막으로 deque도 vector처럼 연속한 원소를 index 정수로 빠르게 접근하도록 at(), []연산자를 제공한다. 둘다 같은 기능을 제공하지만 at()는 유효 범위를 점검하여 안전하게 원소에 접근하도록 하며, []연산자는 유효 범위를 점검하지 않아 원소 접근 속도를 조금 더 높인다.

profile
personal study area

0개의 댓글