STL Deque

Deque

Logical Structure of a Deque
Internal Structure of a Deque

包含头文件<deque>
定义:

1
2
3
4
5
namespace std {
template < typename T,
typename Allocator = allocator<T> >
class deque;
}

顺序容器。几乎与vector接口一样。随机存取。首尾均可快速插入删除。非首尾的插入删除操作会使所有迭代器失效。

Deque容器的操作

Create, Copy and Destroy

Operation Effect
deque c Default constructor; creates an empty deque without any elements
deque c(c2) Copy constructor; creates a new deque as a copy of c2 (all elements are copied)
deque c = c2 Copy constructor; creates a new deque as a copy of c2 (all elements are copied)
deque c(rv) Move constructor; creates a new deque, taking the contents of the rvalue rv (since C++11)
deque c = rv Move constructor; creates a new deque, taking the contents of the rvalue rv (since C++11)
deque c(n) Creates a deque with n elements created by the default constructor
deque c(n, elem) Creates a deque initialized with n copies of element elem
deque c(beg, end) Creates a deque initialized with the elements of the range [beg,end)
deque c(initlist) Creates a deque initialized with the elements of initializer list initlist (since C++11)
deque c = initlist Creates a deque initialized with the elements of initializer list initlist (since C++11)
c.~deque() Destroys all elements and frees the memory

Nonmodifying Operations

Operation Effect
c.empty() Returns whether the container is empty (equivalent to size()==0 but might be faster)
c.size() Returns the current number of elements
c.max_size() Returns the maximum number of elements possible
c.shrink_to_fit() Request to reduce capacity to fit number of elements (since C++11)8
c1 == c2 Returns whether c1 is equal to c2 (calls == for the elements)
c1 != c2 Returns whether c1 is not equal to c2 (equivalent to !(c1==c2) )
c1 < c2 Returns whether c1 is less than c2
c1 > c2 Returns whether c1 is greater than c2 (equivalent to c2<c1)
c1 <= c2 Returns whether c1 is less than or equal to c2 (equivalent to !(c2<c1) )
c1 >= c2 Returns whether c1 is greater than or equal to c2 (equivalent to !(c1<c2) ) c[idx] Returns the element with index idx (no range checking)
c.at(idx) Returns the element with index idx (throws range-error exception if idx is out of range)
c.front() Returns the first element (no check whether a first element exists)
c.back() Returns the last element (no check whether a last element exists)
c.begin() Returns a random-access iterator for the first element
c.end() Returns a random-access iterator for the position after the last element
c.cbegin() Returns a constant random-access iterator for the first element (since C++11)
c.cend() Returns a constant random-access iterator for the position after the last element (since C++11)
c.rbegin() Returns a reverse iterator for the first element of a reverse iteration
c.rend() Returns a reverse iterator for the position after the last element of a reverse iteration
c.crbegin() Returns a constant reverse iterator for the first element of a reverse iteration (since C++11)
c.crend() Returns a constant reverse iterator for the position after the last element of a reverse iteration (since C++11)

Modifying Operations of Deque

Operation Effect
c = c2 Assigns all elements of c2 to c
c = rv Move assigns all elements of the rvalue rv to c (since C++11)
c = initlist Assigns all elements of the initializer list initlist to c (since C++11)
c.assign(n, elem) Assigns n copies of element elem
c.assign(beg, end) Assigns the elements of the range [beg,end)
c.assign(initlist) Assigns all the elements of the initializer list initlist
c1.swap(c2) Swaps the data of c1 and c2
swap(c1, c2) Swaps the data of c1 and c2
c.push_back(elem) Appends a copy of elem at the end
c.pop_back() Removes the last element (does not return it)
c.push_front(elem) Inserts a copy of elem at the beginning
c.pop_front() Removes the first element (does not return it)
c.insert(pos, elem) Inserts a copy of elem before iterator position pos and returns the position of the new element
c.insert(pos, n, elem) Inserts n copies of elem before iterator position pos and returns the position of the first new element (or pos if there is no new element)
c.insert(pos, beg, end) Inserts a copy of all elements of the range [beg,end) before iterator position pos and returns the position of the first new element (or pos if there is no new element)
c.insert(pos, initlist) Inserts a copy of all elements of the initializer list initlist before iterator position pos and returns the position of the first new element (or pos if there is no new element; since C++11)
c.emplace(pos, args…) Inserts a copy of an element initialized with args before iterator position pos and returns the position of the new element (since C++11)
c.emplace_back(args…) Appends a copy of an element initialized with args at the end (returns nothing; since C++11)
c.emplace_front(args…) Inserts a copy of an element initialized with args at the beginning (returns nothing; since C++11)
c.erase(pos) Removes the element at iterator position pos and returns the position of the next element
c.erase(beg, end) Removes all elements of the range [beg,end) and returns the position of the next element
c.resize(num) Changes the number of elements to num (if size() grows new elements are created by their default constructor)
c.resize(num, elem) Changes the number of elements to num (if size() grows new elements are copies of elem)
c.clear() Removes all elements (empties the container)

使用Deque的示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
// Examples of Using Deque
#include <iostream>
#include <deque>
#include <string>
#include <algorithm>
#include <iterator>
using namespace std;

int main()
{

// create empty deque of strings
deque<string> coll;
// insert several elements
coll.assign(3, string("string"));
coll.push_back("last string");
coll.push_front("first string");
// print elements separated by newlines
copy(coll.cbegin(), coll.cend(), ostream_iterator<string>(cout, "\n"));
cout<<endl;
// remove first and last element
coll.pop_front();
coll.pop_back();
// insert "another" into every element but the first
for (unsigned i = 1; i < coll.size(); ++i)
{
coll[i] = "another " + coll[i];
}
// change size to four elements
coll.resize(4, "resized string");
// print elements separated by newlines
copy(coll.cbegin(), coll.cend(), ostream_iterator<string>(cout, "\n"));
system("Pause");
}

[1] The C++ Standard Library 2nd Edition