[STL] deque 컨테이너



우선 deque 컨테이너는 vector컨테이너의 멤버 함수나 인터페이스와 크게 다르지 않기에 vector컨테이너를 잘 공부했으면 deque 컨테이너도 잘 사용할 수 있다.

deque 컨테이너의 장점

그럼 deque 컨테이는 왜 존재하는가? deque 컨테이너는 vector 컨테이너의 단점을 좀 보완한다. 우선 vector 컨테이너의 장점이자 단점으로 하나의 메모리 공간에 데이터들을 보관하기 때문에 메모리 크기보다 데이터가 많아지면 새로운 메모리를 재할당해서 데이터를 복사하는 성능저하가 있지만, deque는 여러개의 메모리 공간을 할당하고 연속된 하나의 메모리 공간처럼 보이게 사용자에게 제공된다.즉, 원소가 추가될 때 메모리가 부족하면 일정한 크기의 메모리를 할당하여 새로 할당한 메모리에 이전 데이터를 복사하지 않고 새로 추가되는 데이터만 넣는다. 예시를 보자.

#include <iostream>
#include<vector>
#include<deque>
using namespace std;

void main() {
	vector<int> v(4, 100);
	//v의 모습 100 100 100 100

	deque<int> dq(4, 100);
	//dq의 모습 100 100 100 100

	v.push_back(200);
	dq.push_back(200);
	//v의 모습 100 100 100 100 200
	//dq의 모습 100 100 100 100 200
}

분명히 v와 dq의 모습을 똑같다. 하지만 메모리가 할당되는 방법과 그로인한 메모리 구조에는 다음과 같은 차이가 있다.

image

위 사진과 같이 vector는 새로운 데이터가 추가될 때 메모리가 부족하면 아예 메모리를 재할당하고 이전 원소들을 복사한다. 하지만 deque는 새로운 메모리를 할당하고 거기다 새로운 데이터를 넣고 메모리가 이전 메모리와 연속된 것처럼 보이게 할당이 된다.(성능상에서 차이가 있다.)

push_front()

deque는 vector와 다르게 원소를 앞쪽으로 넣을수 있다. 예시를 보자.

#include <iostream>
#include<deque>
using namespace std;

void main() {
	deque<int> dq;
	dq.push_back(10);
	dq.push_back(20);
	dq.push_back(30);
	dq.push_back(40);
	//dq의 모습 10 20 30 40

	dq.push_front(100);
	dq.push_front(200);
	//dq의 모습 200 100 10 20 30 40
}

이렇게 push_front를 할 때의 메모리 구조를 봐보자.

image

다음과 같이 메모리를 할당하고 앞쪽에 순서대로 데이터가 들어간다.

반복자

deque도 vector와 마찬가지로 시퀀스 컨테이너이며 배열 기반 컨테이너이기 때문에 임의 접근 반복자를 제공한다. 즉,vector와 마찬가지로 +,-,+=,-=,[] 연산을 수행한다는 것이다.

insert() / erase()

deque도 insert와 erase 멤버 함수를 제공하는데 동작하는 방식이 vector와 조금 다르다. vetor는 새로운 원소를 순차열 중간에 넣으려하면 무조건 나머지 원소들을 뒤로 밀어내지만 deque는 새로운 원소를 순차열 중간에 삽입, 제거 하더라도 원소의 갯수가 적은 쪽으로 밀어낸다. 예시를 보자.

#include <iostream>
#include<deque>
using namespace std;

void main() {
	deque<int> dq;
	dq.push_back(10);
	dq.push_back(20);
	dq.push_back(30);
	dq.push_back(40);
	dq.push_back(50);
    dq.push_back(60);
	//dq의 모습 10 20 30 40 50 60

	deque<int>::iterator iter = dq.begin() + 2;
	deque<int>::iterator iter2;
	iter2 = dq.insert(iter, 100);
	//dq의 모습 10 20 100 30 40 50 60
	//iter2는 100을 가리킴
}

메모리 구조를 살펴보면

image

다음과 같이 앞쪽에 원소의 갯수가 더적어서 앞쪽을 밀면서 삽입 된다. 물론 이것도 성능에 그렇게 좋지는 않지만 무조건 뒤로 밀어내는 vector보다는 성능이 좋다.




© 2022. by KSC

Powered by sora