[C++ STL] Deque Container 사용 방법 & 관련 예제 총 정리

반응형
반응형

#1 About Deque

#2 Deque 사용방법

-2.1 deque 선언 & 초기화

-2.2 deque 값 삽입/삭제 - push_back() pop_back() push_front() pop_front()

-2.3 deque 값 중간 삽입/삭제 - insert() erase()

-2.4 첫 번째 원소 / 마지막 원소 접근 - front() back()

#3 Deque 원소 접근

 

* 개인적인 공부 내용 기록용으로 작성한 글이기에 잘못된 내용이 있을 수 있으며, 지속적으로 수정해 나갈 예정입니다.


#1 About Deque

Deque 컨테이너시퀀스 컨테이너이자, 배열 기반 컨테이너입니다. 그래서 Vector 컨테이너와 특징이 매우 유사합니다.하나의 메모리 블록에 저장되는 Vector와 달리 Deque는 여러개의 메모리 블록에 나뉘어 저장된다는 특징을 갖고 있습니다.벡터의 메모리 구조는 [C++ STL] Vector Container 사용 방법 & 관련 예제 총 정리 포스팅을 참고해 주세요.

 

그림과 같은 메모리 구조를 갖고 있기에, 벡터와 달리 push_front() , pop_front() 를 이용해 앞쪽에서도 원소를 추가/제거할 수 있습니다. 그리고, 중간에서 원소를 추가/삭제를 하는 경우 (insert, erase) Vector에 비해서 효율이 약간 더 우수합니다.

그 이유는 vector는 앞에서 원소를 추가하는 것이 불가능한 스택구조이기에, 모든 원소를 뒤쪽으로 밀어야만 하는데, Deque는 앞 뒤 모두 원소의 추가/삭제가 가능하기에 뒤쪽이나 앞쪽 모두 밀어낼 수 있기 때문입니다.

 

뿐만 아니라, 단순히 push_back을 통해서 원소를 추가하는 경우에도 deque가 더 효율적입니다. Vector는 메모리가 가득 찼을 때 이 전의 메모리를 삭제하고 원소를 복사한 후 메모리를 재할당하는 방식을 채택하는데, Deque는 단순히 메모리 블럭을 하나 새로 할당합니다.

 

#2 Deque 사용방법

#2.1 Deque 선언 & 초기화

Deque를 사용하기 위해서는 우선 <deque>를 include 해줘야 합니다.

#inlcude <deque>

다음은 Deque의 기본적인 선언 및 생성자를 이용한 초기화 방식입니다.

deque<자료형 타입> 이름; 형태로 선언합니다.

#include <deque> // deque 컨테이너를 사용하기 위해 선언
#include <iostream>
using namespace std;

int main()
{
	deque<int> d1; // int type empty deque 생성
	deque<int> d2(5); // 0으로 초기화된 size가 5인 deque
	deque<int> d3(5,10); // 10으로 초기화된 size가 5인 deque
	deque<int> d4 = {1,2,3,4,5}; // 1,2,3,4,5 의 원소를 가진 deque
	deque<int> d5(d4); // d4의 복사본 deque
	
	return 0; 
} 

 

#2.2 Deque 값 추가/삭제

■ push_back & pop_back - 뒤에서 원소를 추가/삭제합니다.

* 참고 size() 멤버함수를 통해 deque의 size를 받아올 수 있습니다.

#include <deque> // deque 컨테이너를 사용하기 위해 선언
#include <iostream>
using namespace std;

int main()
{
	deque<int> d; // int type empty deque 생성
	d.push_back(10); // 10 추가 
	d.push_back(20); // 20 추가 
	d.push_back(30); // 30 추가 
	d.push_back(40); // 40 추가 
	d.pop_back(); // 맨 뒤의 원소 (40) 삭제
	
	for (int i = 0 ; i < d.size(); i++)
	{
		cout << d[i] << " ";
	}
	
	return 0; 
} 
[출력결과]
10 20 30

 

■ push_front & pop_front - 앞에서 원소를 추가/삭제합니다.

#include <deque> // deque 컨테이너를 사용하기 위해 선언
#include <iostream>
using namespace std;

int main()
{
	deque<int> d; // int type empty deque 생성
	d.push_front(10); // 10 추가 
	d.push_front(20); // 20 추가 
	d.push_front(30); // 30 추가 
	d.push_front(40); // 40 추가 
	d.pop_front(); // 맨 앞의 원소 (40) 삭제
	
	for (int i = 0 ; i < d.size(); i++)
	{
		cout << d[i] << " ";
	}
	
	return 0; 
} 
[출력결과] 30 20 10

 

#2.3 Deque 중간 값 추가/삭제

■ insert(위치,값) - 중간에 값을 추가합니다.

* insert 멤버함수는 begin() 반복자와 함께 사용 가능합니다.

#include <deque> // deque 컨테이너를 사용하기 위해 선언
#include <iostream>
using namespace std;

int main()
{
	deque<int> d; // int type empty deque 생성
	d.push_back(10); // 10 추가 
	d.push_back(20); // 20 추가 
	d.push_back(30); // 30 추가 
	d.push_back(40); // 40 추가 

	// begin() + 2 위치에 100 추가
	d.insert(d.begin()+2, 100); 
	
	for (int i = 0 ; i < d.size(); i++)
	{
		cout << d[i] << " ";
	}
	
	return 0; 
} 
[출력 결과] 10 20 100 30 40

 

■ erase(위치,값) - 중간에 값을 삭제합니다.

* erase 멤버함수는 begin() 반복자와 함께 사용 가능합니다.

#include <deque> // deque 컨테이너를 사용하기 위해 선언
#include <iostream>
using namespace std;

int main()
{
	deque<int> d; // int type empty deque 생성
	d.push_back(10); // 10 추가 
	d.push_back(20); // 20 추가 
	d.push_back(30); // 30 추가 
	d.push_back(40); // 40 추가 

	// begin() + 2 위치값(30) 삭제
	d.erase(d.begin()+2); 
	
	for (int i = 0 ; i < d.size(); i++)
	{
		cout << d[i] << " ";
	}
	
	return 0; 
} 
[출력 결과] 10 20 40

 

#2.4 첫 번째 원소 / 마지막 원소 접근

front() , back() 멤버함수를 이용해 deque의 첫 번째 값과 마지막 값을 접근 가능합니다.

#include <deque> // deque 컨테이너를 사용하기 위해 선언
#include <iostream>
using namespace std;

int main()
{
	deque<int> d; // int type empty deque 생성
	d.push_back(10); // 10 추가 
	d.push_back(20); // 20 추가 
	d.push_back(30); // 30 추가 
	d.push_back(40); // 40 추가 
	
	// front() 멤버함수를 이용해 맨 앞의 값(10) 접근 
	cout << "front() ";
	cout << d.front() << endl;
	
	// back() 멤버함수를 이용해 마지막  값(40) 접근
	cout << "back() ";
	cout << d.back() << endl;
	
	return 0; 
} 

 

#3 Deque 원소 접근

Deque는 []연산자와 at()멤버함수를 통해 원소에 접근합니다. []과 at()의 차이는 벡터 포스팅의 4>원소접근에 정리해 두었으니 간단한 사용 예제만 작성하고 마치도록 하겠습니다.

#include <deque> // deque 컨테이너를 사용하기 위해 선언
#include <iostream>
using namespace std;

int main()
{
	deque<int> d; // int type empty deque 생성
	d.push_back(10); // 10 추가 
	d.push_back(20); // 20 추가 
	d.push_back(30); // 30 추가 
	d.push_back(40); // 40 추가 

	cout << "2번째 원소(30) 출력([]): " << d[2] << endl;
	cout << "3번째 원소(40) 출력(at): " << d.at(3) << endl;
	return 0; 
} 
[출력결과] 
2번째 원소(30) 출력([]): 30
3번째 원소(40) 출력(at): 40
반응형

댓글

Designed by JB FACTORY