deque概述
deque是一个双端队列
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16template <class T, class Alloc = alloc, size_t BufSiz = 0>
class deque {
public: // Basic types
typedef T value_type;
typedef value_type* pointer;
···
protected: // Data members
iterator start; // start.cur指向deque的第一个结点
iterator finish; // finish.cur指向迭代器deque的最后一个结点的后一个元素
map_pointer map; // 指向中控器。其实是指向中控器的第一个结点。
// 中控器是连续的,map_size定义了中控器的大小。
size_type map_size; // 中控器的大小。
...
};
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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146/*
此函数用来计算缓冲区的大小
如果n不等于0,那么返回n,开发者自己决定
否则:如果sz小于512,返回512/sz
如果sz大于512,返回1
*/
inline size_t __deque_buf_size(size_t n, size_t sz)
{
return n != 0 ? n : (sz < 512 ? size_t(512 / sz) : size_t(1));
}
//deque的迭代器,未继承std::iterator
template <class T, class Ref, class Ptr, size_t BufSiz>
struct __deque_iterator {
typedef __deque_iterator<T, T&, T*, BufSiz> iterator;
typedef __deque_iterator<T, const T&, const T*, BufSiz> const_iterator;
static size_t buffer_size() {return __deque_buf_size(BufSiz, sizeof(T)); }
//没有继承std::iterator,自己定义5个迭代器相应型别。
typedef random_access_iterator_tag iterator_category; // (1)
typedef T value_type; // (2)
typedef Ptr pointer; // (3)
typedef Ref reference; // (4)
typedef size_t size_type;
typedef ptrdiff_t difference_type; // (5)
typedef T** map_pointer; //注意,是指针的指针
//map_pointer指向中控器,中控器的存储的是指针,指向node-buf结点缓冲区
typedef __deque_iterator self;
T* cur; // 迭代器所指元素
T* first; // 迭代器所指元素所在缓冲区的开头
T* last; // 迭代器所指元素所在缓冲区的结尾(结尾包含在缓冲区内)
map_pointer node;//指向中控器的结点,这个结点指向迭代器所指元素所在的缓冲区
//迭代器的构造函数
//x是迭代器所指结点,y为中控器中的结点的值,指向x所指缓冲区
__deque_iterator(T* x, map_pointer y)
: cur(x), first(*y), last(*y + buffer_size()), node(y) {}
//默认构造函数
__deque_iterator() : cur(0), first(0), last(0), node(0) {}
//用一个迭代器x初始化本迭代器
__deque_iterator(const iterator& x)
: cur(x.cur), first(x.first), last(x.last), node(x.node) {}
//迭代器需要重载的运算符
reference operator*() const { return *cur; }
/*
两个迭代器之间的距离。这两个迭代器可能不在同一个buffer上。
*/
difference_type operator-(const self& x) const {
return difference_type(buffer_size()) * (node - x.node - 1) +
(cur - first) + (x.last - x.cur);
}
/*
迭代器前进一步。
先++cur,再判断cur==last。说明cur不会指向last的。last所指空间不存内容
*/
self& operator++() {
++cur; // 前进一步
if (cur == last) { // 到了所在缓冲区的尾端了
set_node(node + 1); // 切换到下一个缓冲区
cur = first; // 的第一个元素
}
return *this;
}
self operator++(int) {
self tmp = *this;
++*this;
return tmp;
}
//迭代器往回走一步。
self& operator--() {
if (cur == first) { // 如果在所在缓冲区的头部
set_node(node - 1); // 切换到前一个缓冲区
cur = last; // 的最后一个元素
}
--cur; // 直接往回走一步
return *this;
}
self operator--(int) {
self tmp = *this;
--*this;
return tmp;
}
/*
迭代器向前进或后退n步(取决于n的正负)。这是支持random access iterator 所必须的操作。
如果这个操作不会是迭代器走出当前所在缓冲区,直接更改cur即可。
如果这个操作使迭代器走出当前所在缓冲区,要计算出操作后在哪个缓冲区的哪个位置。
*/
self& operator+=(difference_type n) {
difference_type offset = n + (cur - first);
if (offset >= 0 && offset < difference_type(buffer_size()))
// 不会走出当前所在缓冲区
cur += n;
else {
// 走出了当前所在缓冲区
difference_type node_offset =
offset > 0 ? offset / difference_type(buffer_size())
: -difference_type((-offset - 1) / buffer_size()) - 1;
// 切换缓冲区
set_node(node + node_offset);
// 找到切换缓冲区后,迭代器所指向的元素
cur = first + (offset - node_offset * difference_type(buffer_size()));
}
return *this;
}
self operator+(difference_type n) const {
self tmp = *this;
return tmp += n; // 调用operator+=
}
//调用operator+=
self& operator-=(difference_type n) { return *this += -n; }
self operator-(difference_type n) const {
self tmp = *this;
return tmp -= n; // 调用operator-=
}
reference operator[](difference_type n) const { return *(*this + n); }
// 以上调用了operator*, operator+
/*迭代器关于比较的运算符的重载*/
bool operator==(const self& x) const { return cur == x.cur; }
bool operator!=(const self& x) const { return !(*this == x); }
bool operator<(const self& x) const {
return (node == x.node) ? (cur < x.cur) : (node < x.node);
}
//切换缓冲区,更改了first和last,但是未更改cur
void set_node(map_pointer new_node) {
node = new_node;
first = *new_node;
last = first + difference_type(buffer_size());
}
};
deque的定义
1 | template <class T, class Alloc = alloc, size_t BufSiz = 0> |