std::deque (3) - Linux Manuals
std::deque: std::deque
NAME
Synopsis
Defined in header <deque>
template<
class T, (1)
class Allocator = std::allocator<T>
> class deque;
namespace pmr {
template <class T> (2) (since C++17)
using deque = std::deque<T, std::pmr::polymorphic_allocator<T>>;
}
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:
* Random access - constant O(1)
* Insertion or removal of elements at the end or beginning - constant O(1)
* Insertion or removal of elements - linear O(n)
std::deque meets the requirements of Container, AllocatorAwareContainer, SequenceContainer and ReversibleContainer.
Template parameters
T - T must meet the requirements of CopyAssignable and CopyConstructible. (until 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 if Allocator::value_type is not the same as T.
Iterator invalidation
This section is incomplete
There are still a few inaccuracies in this section, refer to individual member function pages for more detail
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, emplace, push_front, push_back, emplace_front, emplace_back Always
erase If erasing at end - only erased elements and the past-the-end iterator
resize If the new size is bigger than the old one : all iterators are invalidated
pop_front Only to the element erased
pop_back Only to the element erased and the past-the-end iterator
Invalidation notes
* When inserting at either end of the deque, references are not invalidated by insert and emplace.
* push_front, push_back, emplace_front and emplace_back do not invalidate any references to elements of the deque.
* When erasing at either end of the deque, references to non-erased elements are not invalidated by erase, pop_front and pop_back.
* A call to resize with a smaller size does not invalidate any references to non-erased elements.
* A call to resize with a bigger size does not invalidate any references to elements of the deque.
Member types
Member type Definition
value_type T
allocator_type Allocator
size_type Unsigned integer type (usually std::size_t)
difference_type Signed integer type (usually std::ptrdiff_t)
reference Allocator::reference (until C++11)
const_reference Allocator::const_reference (until C++11)
pointer Allocator::pointer (until C++11)
const_pointer Allocator::const_pointer (until C++11)
iterator LegacyRandomAccessIterator
const_iterator Constant LegacyRandomAccessIterator
reverse_iterator std::reverse_iterator<iterator>
const_reverse_iterator std::reverse_iterator<const_iterator>
Member functions
constructor (public member function)
destructor (public member function)
operator= (public member function)
assign (public member function)
get_allocator (public member function)
Element access
at (public member function)
operator[] (public member function)
front (public member function)
back (public member function)
Iterators
begin returns an iterator to the beginning
cbegin (public member function)
end_ returns an iterator to the end
cend (public member function)
rbegin returns a reverse iterator to the beginning
crbegin (public member function)
rend returns a reverse iterator to the end
crend (public member function)
Capacity
empty (public member function)
size (public member function)
max_size (public member function)
shrink_to_fit reduces memory usage by freeing unused memory
(C++11)
Modifiers
clear (public member function)
insert (public member function)
emplace constructs element in-place
(C++11)
erase (public member function)
push_back (public member function)
emplace_back constructs an element in-place at the end
(C++11)
pop_back (public member function)
push_front (public member function)
emplace_front constructs an element in-place at the beginning
(C++11)
pop_front (public member function)
resize (public member function)
swap (public member function)
Non-member functions
operator==
operator!= lexicographically compares the values in the deque
operator< (function template)
operator<=
operator>
operator>=
std::swap(std::deque) (function template)
erase(std::deque) Erases all elements satisfying specific criteria
erase_if(std::deque) (function template)
(C++20)
Deduction_guides(since C++17)
Example
// Run this code
Output: