[C++] deque 클래스 정리

🦥 deque?

1) Double Ended Queue

queue는 데이터를 front에서만 삭제하고, end에서만 삽입한다. 하지만 double ended queue는 이름에서 알 수 있듯이, front와 back 양쪽에서 삽입과 삭제가 모두 가능한 구조이다.

2) Sequence container, but not stored contiguously

deque는 sequence container, 즉 임의의 원소에 접근 가능한 구조이다. deque는 vector와 달리 메모리가 연속적으로 할당되지는 않아서 (not stored contiguously), 원소를 추가할 때에 기존 원소들을 복사하여 새로운 메모리 공간을 만드는 작업을 할 필요가 없다. 그래서 원소의 삽입과 삭제에 있어 좀더 효율적이다.

✅ 이 포스트는 C++ STL에서의 deque에 대한 글입니다. deque 자료구조의 특징, 장/단점, 시간 복잡도에 대해서 더 알아보려면 ▶ [자료구조] 스택(Stack), 큐(Queue), 덱(Deque)


🦥 deque의 생성자와 초기화

deque 헤더 추가

#include <deque>

1) 비어있는 deque 생성

deque<int> dq1;

2) 0으로 초기화 된 4개의 원소를 가진 deque를 생성

deque<int> dq2(4);

3) 1, 2, 3을 원소로 하는 deque 생성

// 두 가지 방법 다 가능
deque<int> dq3 = { 1, 2, 3 };
deque<int> dq4{ 1, 2, 3 };

🦥 deque의 함수들

🌴 Iterator

Iterator를 활용하여 deque의 원소에 접근할 수 있다

  • dq.begin() : deque의 첫번째 원소를 가리키는 iterator
  • dq.end() : deque의 마지막 원소 다음을 가리키는 iterator (마지막 원소 아님!!)
/* deque의 모든 원소 출력 */
for (auto i = dq.begin(); i != dq.end(); i++) {
	cout << *i << endl;
}


🌴 Fuction

vector 컨테이너의 멤버 함수들

1) 초기화

  • dq.assign(5) : 원소 5개 0으로 초기화
  • dq.assign(5,10) : 원소 5개 10으로 초기화

2) 원소 접근

  • dq.front() : 첫 번째 원소
  • dq.back() : 마지막 원소
  • dq.at(i) : i번째 원소

3) 원소 삽입 / 삭제

  • dq.push_front(5) : 첫 번째 원소 앞에 ‘5’ 삽입
  • dq.push_back(5) : 마지막 원소 뒤에 ‘5’ 삽입
  • dq.pop_front() : 첫 번째 원소 삭제
  • dq.pop_back() : 마지막 원소 삭제
  • dq.insert(v.begin(), 3) : deque 처음에 (iterator가 가리키는 위치에) ‘3’ 추가. ex) dq.insert(3, 4) - 3번 위치에 4 추가하고, 가리키는 iterator 반환

4) deque 크기 관련

  • dq.empty() : deque가 비어있는지 확인
  • dq.size() : 실제 원소 수
  • dq.resize(10) : 메모리 공간 크기를 10으로 변경. 늘어난 공간은 0으로 초기화.
    * deque는 capacity 함수 없음

5) 원소 삭제 dq.clear() : 전체 원소 삭제 dq.erase(v.begin()) : iterator가 가리키는 원소 삭제. size만 변함.


실습 코드

#include <iostream> 
#include <deque> 

using namespace std;
void showAll(deque <int> dq)
{
    while (!dq.empty())
    {
        cout << dq.front() << ' ';
        dq.pop_front();
    }
}

int main()
{
    deque<int> dq;
    dq.push_back(10);
    dq.push_back(20);
    dq.push_front(30);

    cout << "Show all queue elements : ";
    showAll(dq);

    cout << "\nq.size() : " << dq.size();
    cout << "\nq.front() : " << dq.front();
    cout << "\nq.back() : " << dq.back();

    cout << "\nq.pop_front()\n";
    dq.pop_front();
    cout << "Show all queue elements : ";
    showAll(dq);

    cout << "\ndq.pop_back()\n";
    dq.pop_back();
    cout << "Show all queue elements : ";
    showAll(dq);

    dq.clear();
    cout << "\nShow all queue elements : ";
    showAll(dq);
   
    return 0;
}

[실행 결과]

Show all queue elements : 30 10 20
q.size() : 3
q.front() : 30
q.back() : 20
q.pop_front()
Show all queue elements : 10 20
dq.pop_back()
Show all queue elements : 10
Show all queue elements :

Reference

Categories:

Updated:

Leave a comment