std::deque
(double-ended queue) is an indexed sequence container that allows fast insertion and deletion at both its beginning and its end. In addition, insertion and deletion at either end of a deque never invalidates pointers or references to the rest of the elements.
As opposed to std::vector, the elements of a deque are not stored contiguously: typical implementations use a sequence of individually allocated fixed-size arrays, with additional bookkeeping, which means indexed access to deque must perform two pointer dereferences, compared to vector's indexed access which performs only one.
The storage of a deque is automatically expanded and contracted as needed. Expansion of a deque is cheaper than the expansion of a std::vector because it does not involve copying of the existing elements to a new memory location. On the other hand, deques typically have large minimal memory cost; a deque holding just one element has to allocate its full internal array (e.g. 8 times the object size on 64-bit libstdc++; 16 times the object size or 4096 bytes, whichever is larger, on 64-bit libc++).
The complexity (efficiency) of common operations on deques is as follows:
std::deque
meets the requirements of Container, AllocatorAwareContainer, SequenceContainer and ReversibleContainer.
std::deque
are constexpr: it is possible to create and use std::deque
objects in the evaluation of a constant expression.
However, std::deque
objects generally cannot be constexpr, because any dynamically allocated storage must be released in the same evaluation of constant expression.
T
must meet the requirements of CopyAssignable and CopyConstructible. (until C++11) The requirements that are imposed on the elements depend on the actual operations performed on the container. Generally, it is required that element type is a complete type and meets the requirements of Erasable, but many member functions impose stricter requirements. (since C++11)
Allocator - An allocator that is used to acquire/release memory and to construct/destroy the elements in that memory. The type must meet the requirements of Allocator. The behavior is undefined(until C++20)The program is ill-formed(since C++20) if Allocator::value_type
is not the same as T
.[edit] [edit] Iterator invalidation Operations Invalidated All read only operations. Never. swap, std::swap The past-the-end iterator may be invalidated (implementation defined). shrink_to_fit, clear, insert,
If erasing at end - only erased elements and the past-the-end iterator.
Otherwise - all iterators are invalidated.
It is unspecified when the past-the-end iterator is invalidated.
(until C++11)The past-the-end iterator is also invalidated unless the erased
elements are at the beginning of the container and the last
element is not erased.
If the new size is bigger than the old one - all iterators are invalidated.
Otherwise - none iterators are invalidated.
The past-the-end iterator may be invalidated (implementation defined).
(until C++11)The past-the-end iterator is also invalidated.
(since C++11) [edit] Invalidation notesdeque
deque
#include <deque> #include <iostream> int main() { // Create a deque containing integers std::deque<int> d = {7, 5, 16, 8}; // Add an integer to the beginning and end of the deque d.push_front(13); d.push_back(25); // Iterate and print values of deque for (int n : d) std::cout << n << ' '; std::cout << '\n'; }
Output:
[edit] Defect reportsThe following behavior-changing defect reports were applied retroactively to previously published C++ standards.
DR Applied to Behavior as published Correct behavior LWG 230 C++98T
was not required to be CopyConstructible
T
might not be able to be constructed) T
is also required to
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4