Namespaces
Variants

std:: deque

From cppreference.net
헤더 파일에 정의됨 <deque>
template <

class T,
class Allocator = std:: allocator < T >

> class deque ;
(1)
namespace pmr {

template < class T >
using deque = std :: deque < T, std:: pmr :: polymorphic_allocator < T >> ;

}
(2) (C++17부터)

std::deque (double-ended queue)는 양쪽 끝에서 빠른 삽입과 삭제를 허용하는 인덱스 기반 시퀀스 컨테이너입니다. 또한, deque의 어느 쪽 끝에서든 삽입과 삭제를 수행해도 나머지 요소들에 대한 포인터나 참조가 무효화되지 않습니다.

std::vector 와 달리, deque의 요소들은 연속적으로 저장되지 않습니다: 일반적인 구현은 개별적으로 할당된 고정 크기 배열들의 시퀀스와 추가적인 부기 작업을 사용하며, 이는 deque의 인덱스 접근이 두 번의 포인터 역참조를 수행해야 함을 의미합니다. 이는 vector의 인덱스 접근이 단 한 번의 역참조만 수행하는 것과 대비됩니다.

deque의 저장 공간은 필요에 따라 자동으로 확장 및 축소됩니다. deque의 확장은 기존 요소들을 새로운 메모리 위치로 복사하는 과정을 수반하지 않기 때문에 std::vector 의 확장보다 비용이 적게 듭니다. 반면에, deque는 일반적으로 큰 최소 메모리 비용을 가지며, 단 하나의 요소만 보유하는 deque도 전체 내부 배열을 할당해야 합니다 (예: 64비트 libstdc++에서는 객체 크기의 8배, 64비트 libc++에서는 객체 크기의 16배 또는 4096바이트 중 더 큰 값).

덱(deque)에서 일반적인 연산의 복잡도(효율성)는 다음과 같습니다:

  • 임의 접근 - 상수 시간 O(1) .
  • 끝이나 시작 부분에서의 요소 삽입 또는 제거 - 상수 시간 O(1) .
  • 요소 삽입 또는 제거 - 선형 시간 O(n) .

std::deque Container , AllocatorAwareContainer , SequenceContainer ReversibleContainer 요구 사항을 충족합니다.

std::deque 의 모든 멤버 함수는 constexpr 입니다: 상수 표현식 평가에서 std::deque 객체를 생성하고 사용하는 것이 가능합니다.

그러나, std::deque 객체는 일반적으로 constexpr 이 될 수 없습니다. 왜냐하면 동적으로 할당된 모든 저장 공간은 동일한 상수 표현식 평가에서 해제되어야 하기 때문입니다.

(C++26부터)

목차

템플릿 매개변수

T - 요소의 타입.
T CopyAssignable CopyConstructible 요구사항을 충족해야 합니다. (C++11 이전)
요소에 부과되는 요구사항은 컨테이너에서 수행되는 실제 연산에 따라 다릅니다. 일반적으로 요소 타입이 완전한 타입이어야 하며 Erasable 요구사항을 충족해야 하지만, 많은 멤버 함수들은 더 엄격한 요구사항을 부과합니다. (C++11 이후)

Allocator - 메모리를 획득/해제하고 해당 메모리에서 요소를 생성/소멸시키는 데 사용되는 할당자. 이 타입은 Allocator 요구사항을 충족해야 합니다. 정의되지 않은 동작 (C++20 이전) 프로그램이 ill-formed (C++20 이후) 입니다 Allocator::value_type T 와 동일하지 않은 경우.

반복자 무효화

연산 무효화 여부
모든 읽기 전용 연산 절대 없음
swap , std::swap past-the-end 반복자가 무효화될 수 있음 (구현 정의)
shrink_to_fit , clear , insert ,
emplace , push_front , push_back ,
emplace_front , emplace_back
항상 무효화
erase begin에서 삭제 시 - 삭제된 요소만 무효화

end에서 삭제 시 - 삭제된 요소와 past-the-end 반복자만 무효화
그 외의 경우 - 모든 반복자가 무효화됨

past-the-end 반복자가 언제 무효화되는지는 명시되지 않음

(C++11 이전)

삭제된 요소가 컨테이너의 시작 부분에 있고 마지막 요소가
삭제되지 않는 경우를 제외하고 past-the-end 반복자도 무효화됨

(C++11 이후)
resize 새 크기가 이전 크기보다 작은 경우 - 삭제된 요소와 past-the-end 반복자만 무효화

새 크기가 이전 크기보다 큰 경우 - 모든 반복자가 무효화됨
그 외의 경우 - 어떤 반복자도 무효화되지 않음

pop_front , pop_back 삭제된 요소에 대한 반복자 무효화

past-the-end 반복자가 무효화될 수 있음 (구현 정의)

(C++11 이전)

past-the-end 반복자도 무효화됨

(C++11 이후)

무효화 참고 사항

  • deque의 양쪽 끝에 삽입할 때, 참조는 insert emplace 에 의해 무효화되지 않습니다.
  • push_front , push_back , emplace_front emplace_back 은 deque의 요소에 대한 어떤 참조도 무효화하지 않습니다.
  • deque의 양쪽 끝에서 삭제할 때, 삭제되지 않은 요소에 대한 참조는 erase , pop_front pop_back 에 의해 무효화되지 않습니다.
  • 더 작은 크기로 resize 를 호출해도 삭제되지 않은 요소에 대한 어떤 참조도 무효화되지 않습니다.
  • 더 큰 크기로 resize 를 호출해도 deque의 요소에 대한 어떤 참조도 무효화되지 않습니다.

멤버 타입

멤버 타입 정의
value_type T
allocator_type Allocator
size_type 부호 없는 정수 타입 (일반적으로 std::size_t )
difference_type 부호 있는 정수 타입 (일반적으로 std::ptrdiff_t )
reference value_type &
const_reference const value_type &
pointer

Allocator::pointer

(C++11 이전)

std:: allocator_traits < Allocator > :: pointer

(C++11 이후)
const_pointer

Allocator::const_pointer

(C++11 이전)

std:: allocator_traits < Allocator > :: const_pointer

(C++11 이후)
iterator LegacyRandomAccessIterator ConstexprIterator (C++26 이후) 이며 value_type 을 가리킴
const_iterator LegacyRandomAccessIterator ConstexprIterator (C++26 이후) 이며 const value_type 을 가리킴
reverse_iterator std:: reverse_iterator < iterator >
const_reverse_iterator std:: reverse_iterator < const_iterator >

멤버 함수

deque 를 생성합니다
(public member function)
deque 를 소멸시킵니다
(public member function)
컨테이너에 값을 할당합니다
(public member function)
컨테이너에 값을 할당합니다
(public member function)
컨테이너에 값들의 범위를 할당합니다
(public member function)
관련 할당자 반환
(public member function)
요소 접근
범위 검사와 함께 지정된 요소에 접근
(public member function)
지정된 요소에 접근
(public member function)
첫 번째 요소에 접근
(public member function)
마지막 요소에 접근
(public member function)
반복자
시작 부분에 대한 반복자를 반환합니다
(public member function)
(C++11)
끝을 가리키는 반복자를 반환합니다
(public member function)
시작 부분을 가리키는 역방향 반복자를 반환합니다
(public member function)
(C++11)
역방향 반복자를 끝 위치로 반환합니다
(public member function)
용량
컨테이너가 비어 있는지 확인합니다
(public member function)
요소의 개수를 반환합니다
(public member function)
가능한 최대 원소 개수를 반환합니다
(public member function)
사용하지 않는 메모리를 해제하여 메모리 사용량을 줄입니다
(public member function)
수정자
내용을 지움
(public member function)
요소 삽입
(public member function)
요소 범위를 삽입합니다
(public member function)
(C++11)
제자리에서 요소를 생성합니다
(public member function)
요소들을 삭제함
(public member function)
끝에 요소를 추가합니다
(public member function)
끝에 제자리에서 요소를 생성합니다
(public member function)
끝에 요소들의 범위를 추가합니다
(public member function)
마지막 요소를 제거합니다
(public member function)
시작 부분에 요소를 삽입합니다
(public member function)
시작 부분에 제자리에서 요소를 생성합니다
(public member function)
시작 부분에 요소들의 범위를 추가합니다
(public member function)
첫 번째 요소를 제거합니다
(public member function)
저장된 요소의 수를 변경합니다
(public member function)
내용을 교환합니다
(public member function)

비멤버 함수

(C++20에서 제거됨) (C++20에서 제거됨) (C++20에서 제거됨) (C++20에서 제거됨) (C++20에서 제거됨) (C++20)
deque 의 값을 사전식으로 비교
(함수 템플릿)
std::swap 알고리즘을 특수화
(함수 템플릿)
특정 조건을 만족하는 모든 요소를 삭제
(함수 템플릿)

추론 가이드

(C++17부터)

참고 사항

기능 테스트 매크로 표준 기능
__cpp_lib_containers_ranges 202202L (C++23) 컨테이너를 위한 범위 생성 및 삽입
__cpp_lib_constexpr_deque 202502L (C++26) constexpr std::deque

예제

#include <deque>
#include <iostream>
int main()
{
    // 정수를 포함하는 deque 생성
    std::deque<int> d = {7, 5, 16, 8};
    // deque의 시작과 끝에 정수 추가
    d.push_front(13);
    d.push_back(25);
    // deque의 값들을 순회하며 출력
    for (int n : d)
        std::cout << n << ' ';
    std::cout << '\n';
}

출력:

13 7 5 16 8 25

결함 보고서

다음 동작 변경 결함 보고서는 이전에 게시된 C++ 표준에 소급 적용되었습니다.

DR 적용 대상 게시된 동작 올바른 동작
LWG 230 C++98 T CopyConstructible 요구사항을 만족할 필요가 없었음
( T 타입의 요소가 생성되지 못할 수 있었음)
T 또한
CopyConstructible 요구사항을 만족해야 함

참고 항목

컨테이너를 적응시켜 큐(FIFO 데이터 구조)를 제공함
(클래스 템플릿)