std:: deque
|
헤더 파일에 정의됨
<deque>
|
||
|
template
<
class
T,
|
(1) | |
|
namespace
pmr
{
template
<
class
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
객체를 생성하고 사용하는 것이 가능합니다.
그러나,
|
(C++26부터) |
목차 |
템플릿 매개변수
| T | - |
요소의 타입.
|
||||
| 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 반복자만 무효화
|
||||
| resize |
새 크기가 이전 크기보다 작은 경우 - 삭제된 요소와 past-the-end 반복자만 무효화
새 크기가 이전 크기보다 큰 경우 - 모든 반복자가 무효화됨
|
||||
| pop_front , pop_back |
삭제된 요소에 대한 반복자 무효화
|
무효화 참고 사항
- 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
|
|
||||
const_pointer
|
|
||||
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) |
|
|
(C++23)
|
컨테이너에 값들의 범위를 할당합니다
(public member function) |
|
관련 할당자 반환
(public member function) |
|
요소 접근 |
|
|
범위 검사와 함께 지정된 요소에 접근
(public member function) |
|
|
지정된 요소에 접근
(public member function) |
|
|
첫 번째 요소에 접근
(public member function) |
|
|
마지막 요소에 접근
(public member function) |
|
반복자 |
|
|
(C++11)
|
시작 부분에 대한 반복자를 반환합니다
(public member function) |
|
(C++11)
|
끝을 가리키는 반복자를 반환합니다
(public member function) |
|
(C++11)
|
시작 부분을 가리키는 역방향 반복자를 반환합니다
(public member function) |
|
(C++11)
|
역방향 반복자를 끝 위치로 반환합니다
(public member function) |
용량 |
|
|
컨테이너가 비어 있는지 확인합니다
(public member function) |
|
|
요소의 개수를 반환합니다
(public member function) |
|
|
가능한 최대 원소 개수를 반환합니다
(public member function) |
|
|
(
DR*
)
|
사용하지 않는 메모리를 해제하여 메모리 사용량을 줄입니다
(public member function) |
수정자 |
|
|
내용을 지움
(public member function) |
|
|
요소 삽입
(public member function) |
|
|
(C++23)
|
요소 범위를 삽입합니다
(public member function) |
|
(C++11)
|
제자리에서 요소를 생성합니다
(public member function) |
|
요소들을 삭제함
(public member function) |
|
|
끝에 요소를 추가합니다
(public member function) |
|
|
(C++11)
|
끝에 제자리에서 요소를 생성합니다
(public member function) |
|
(C++23)
|
끝에 요소들의 범위를 추가합니다
(public member function) |
|
마지막 요소를 제거합니다
(public member function) |
|
|
시작 부분에 요소를 삽입합니다
(public member function) |
|
|
(C++11)
|
시작 부분에 제자리에서 요소를 생성합니다
(public member function) |
|
(C++23)
|
시작 부분에 요소들의 범위를 추가합니다
(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
|
예제
출력:
13 7 5 16 8 25
결함 보고서
다음 동작 변경 결함 보고서는 이전에 게시된 C++ 표준에 소급 적용되었습니다.
| DR | 적용 대상 | 게시된 동작 | 올바른 동작 |
|---|---|---|---|
| LWG 230 | C++98 |
T
가
CopyConstructible
요구사항을 만족할 필요가 없었음
(
T
타입의 요소가 생성되지 못할 수 있었음)
|
T
또한
CopyConstructible 요구사항을 만족해야 함 |
참고 항목
|
컨테이너를 적응시켜 큐(FIFO 데이터 구조)를 제공함
(클래스 템플릿) |