1. 개요

std::deque(double-ended queue)는 양쪽 끝에서 삽입과 삭제가 가능한 시퀀스 컨테이너입니다. <deque> 헤더에 정의되어 있으며, 내부적으로 블록 단위로 메모리를 관리합니다.

 #include <deque>
 std::deque<int> dq = {1, 2, 3};

2. 주요 특징

  • 양쪽 끝에서 삽입/삭제가 O(1) 시간에 가능
  • 임의 접근(random access) 가능
  • 메모리는 연속적이지 않음 (블록 기반)
  • 중간 삽입/삭제는 느림
  • 반복자 무효화: 삽입/삭제 시 일부 반복자 무효화 가능

    3. 주요 생성자

생성자 설명
deque() 빈 덱 생성
deque(size_type n) n개의 기본값 요소 생성
deque(size_type n, const T& val) n개의 val로 초기화
deque(InputIterator first, InputIterator last) 범위 기반 초기화
deque(const deque& other) 복사 생성자

4. 주요 멤버 함수

🔹 크기 관련

함수 설명
size() 요소 수
max_size() 최대 요소 수
empty() 비었는지 확인
resize(n) 크기 조절
shrink_to_fit() 메모리 최적화
clear() 모든 요소 삭제

🔹 접근

함수 설명
operator[], at(i) 인덱스를 통한 요소 접근
front() / back() 양 끝 요소
data() 내부 배열 포인터 (C++17~)

🔹 삽입/삭제

함수 설명
push_front(val) / push_back(val) 앞/뒤에 요소 추가
pop_front() / pop_back() 앞/뒤 요소 제거
insert(pos, val) 특정 위치에 삽입
erase(pos) 특정 위치 요소 제거
emplace(pos, args...) 위치에 직접 생성
emplace_front(args...) / emplace_back(args...) 앞/뒤에 직접 생성
assign() 범위 또는 값으로 전체 초기화
swap() 두 덱 교환

5. 반복자 관련

함수 설명
begin() / end() 정방향 반복자
rbegin() / rend() 역방향 반복자
cbegin() / cend() const 반복자

6. 예제 코드

 #include <iostream>
 #include <deque>
 using namespace std;
 
 int main() {
     deque<int> dq = {2, 3};
 
     dq.push_front(1);
     dq.push_back(4);
 
     for (int v : dq) {
         cout << v << " ";
     }
     cout << endl;
 
     dq.pop_front();
     dq.pop_back();
 
     for (int v : dq) {
         cout << v << " ";
     }
     cout << endl;
 
     return 0;
 }

7. std::vector vs std::deque

항목 std::deque std::vector
메모리 블록 분산 연속적
앞 삽입/삭제 빠름 느림
뒤 삽입/삭제 빠름 빠름
임의 접근 O(1) O(1)
메모리 오버헤드 있음 적음

8. 주의사항

  • 메모리가 연속적이지 않아 C 배열처럼 사용은 제한적
  • 반복자 사용 시 삽입/삭제로 인한 무효화에 주의
  • 다방향 삽입/삭제가 필요한 경우 유용

글 이동

Comments