STL容器之deque容器

STL-deque

Posted by Zhihao on 2020-11-21

The First Title Picture

基础

功能:

双端数组,可以对头端进行插入删除操作。

deque与vector区别:

  • vector对于头部的插入删除效率低,数据量越大,效率越低。

  • deque相对而言,对头部的插入删除速度回比vector快。

  • vector访问元素时的速度会比deque快,这和两者内部实现有关。

The First Title Picture

deque内部工作原理:

  • deque内部有个中控器,维护每段缓冲区中的内容,缓冲区中存放真实数据。

  • 中控器维护的是每个缓冲区的地址,使得使用deque时像一片连续的内存空间。

  • deque容器的迭代器也是支持随机访问的。

The First Title Picture

代码

Talk is cheap, show me the code.

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
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
#include<iostream>
using namespace std;
#include<deque>
#include<algorithm>


void printDeque(const deque<int>& dd)
{
//注意这里的只读迭代器的操作
for (deque<int>::const_iterator it = dd.begin(); it != dd.end(); it++)
{
cout << *it << " ";
}
cout << endl;
}


/*
构造函数原型:
deque<T> deqT; //默认构造形式
deque(beg, end); //构造函数将[beg, end)区间中的元素拷贝给本身。
deque(n, elem); //构造函数将n个elem拷贝给本身。
deque(const deque &deq); //拷贝构造函数
*/

void test01()
{
deque<int> d1;
for (int i = 0; i < 10; i++)
{
d1.push_back(i);
}
printDeque(d1);

deque<int> d2(d1.begin(), d1.end());
printDeque(d2);

deque<int> d3(10, 88);
printDeque(d3);

deque<int> d4(d3);
printDeque(d4);

}


/*
赋值函数原型:
deque& operator=(const deque &deq); //重载等号操作符
assign(beg, end); //将[beg, end)区间中的数据拷贝赋值给本身。
assign(n, elem); //将n个elem拷贝赋值给本身。
*/

void test02()
{
deque<int> d1;
for (int i = 0; i < 10; i++)
{
d1.push_back(i);
}

deque<int> d2;
d2 = d1;
printDeque(d2);

deque<int> d3;
d3.assign(d2.begin(), d2.end());
printDeque(d3);

deque<int> d4;
d4.assign(10, 88);
printDeque(d4);
}


/*
大小操作函数原型:
deque.empty(); //判断容器是否为空
deque.size(); //返回容器中元素的个数
deque.resize(num); //重新指定容器的长度为num,若容器变长,则以默认值填充新位置。
//如果容器变短,则末尾超出容器长度的元素被删除。
deque.resize(num, elem); //重新指定容器的长度为num,若容器变长,则以elem值填充新位置。
//如果容器变短,则末尾超出容器长度的元素被删除。
*/

// 我们发现跟vector相比没有了capacity容量相关的操作,因为可以无限地扩展,只需要有一段地址来维护空间


void test03()
{
deque<int> d1;
for (int i = 0; i < 10; i++)
{
d1.push_back(i);
}
printDeque(d1);

if (d1.empty())
{
cout << "EMPTY" << endl;
}
else
{
cout << d1.size() << endl;
}

d1.resize(20, 999);
printDeque(d1);
}


/*
插入和删除函数原型:
两端插入操作:
push_back(elem); //在容器尾部添加一个数据
push_front(elem); //在容器头部插入一个数据
pop_back(); //删除容器最后一个数据
pop_front(); //删除容器第一个数据
指定位置操作:
insert(pos,elem); //在pos位置插入一个elem元素的拷贝,返回新数据的位置。
insert(pos,n,elem); //在pos位置插入n个elem数据,无返回值。
insert(pos,beg,end); //在pos位置插入[beg,end)区间的数据,无返回值。
clear(); //清空容器的所有数据
erase(beg,end); //删除[beg,end)区间的数据,返回下一个数据的位置。
erase(pos); //删除pos位置的数据,返回下一个数据的位置。
*/

void test04()
{
deque<int> d1;
d1.push_back(100);
d1.push_back(100);
d1.push_back(100);
d1.push_back(100);
d1.push_back(100);
d1.push_back(100);
printDeque(d1);

d1.push_front(200);
printDeque(d1);

d1.pop_back();
printDeque(d1);

d1.pop_front();
printDeque(d1);

d1.insert(d1.begin() + 2, 5, 1000);
printDeque(d1);

d1.insert(d1.end() - 1, d1.begin(), d1.end());
printDeque(d1);

d1.erase(d1.begin()+1);
printDeque(d1);

d1.clear();
printDeque(d1);

}


/*
数据存取函数原型:
at(int idx); //返回索引idx所指的数据
operator[]; //返回索引idx所指的数据
front(); //返回容器中第一个数据元素
back(); //返回容器中最后一个数据元素
*/

void test05()
{
deque<int> d1;
for (int i = 0; i < 10; i++)
{
d1.push_back(i);
}
printDeque(d1);

cout << d1.at(2) << endl;
cout << d1[2] << endl;
cout << d1.front() << endl;
cout << d1.back() << endl;
}


/*
排序算法:
sort(iterator beg, iterator end) //对beg和end区间内元素进行排序
*/

void test06()
{
deque<int> d1;
d1.push_back(10);
d1.push_back(20);
d1.push_back(15);

d1.push_front(89);
d1.push_front(78);
d1.push_front(99);

printDeque(d1);
sort(d1.begin(), d1.end());
printDeque(d1);
}



int main()
{
test01();
test02();
test03();
test04();
test05();
test06();
system("pause");
return 0;
}

...

...

00:00
00:00