[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