deque容器为双端数组,可以对头端和尾端进行插入删除操作。
deque与vector区别:
从两者内部实现比较:
- vector对于头部的插入删除效率低,数据量越大,效率越低;deque相对而言,对头部插入删除速度会比vector快
- vector访问元素时的速度比deque快
简单理解:vector读数据快,deque写数据快。
deque内部工作原理:
deque内部有个中控器,维护每段缓冲区,缓冲区中存放真实数据;中控器维护的是每个缓冲区的地址,使得使用deque时像一年连续的内存空间。如下图所示:

函数原型:
- deque
deqT; //默认构造形式 - deque(beg, end); //构造函数将[beg, end)区间中的元素拷贝给当前deque
- deque(n, elem); //构造函数将n个elem拷贝给当前deque
- deque(const deque& deq); //拷贝构造函数
- #include
- #include
- using namespace std;
-
- void print(const deque<int>& d)
- {
- for (deque<int>::const_iterator it = d.begin(); it < d.end(); it++)
- {
- cout << *it << " ";
- }
- cout << endl;
- }
-
- int main()
- {
- // STL - deque - 构造函数
- /*函数原型:
- 1、deque
deqT; //默认构造形式 - 2、deque(beg, end); //构造函数将[beg, end)区间中的元素拷贝给当前deque
- 3、deque(n, elem); //构造函数将n个elem拷贝给当前deque
- 4、deque(const deque& deq); //拷贝构造函数
- */
-
- //1、deque
deqT; - deque<int> d1;
- for (int i = 0; i < 5; i++)
- {
- d1.push_back(i + 1);
- }
- print(d1);
-
- //2、deque(beg, end);
- deque<int> d2(d1.begin(), d1.end());
- print(d2);
-
- //3、deque(n, elem);
- deque<int> d3(5, 8);
- print(d3);
-
- //4、deque(const deque& deq);
- deque<int> d4(d1);
- print(d4);
-
- system("pause");
-
- return 0;
- }
输出结果
1 2 3 4 5
1 2 3 4 5
8 8 8 8 8
1 2 3 4 5
函数原型:
- deque& operator=(const deque& deq); //重载运算符=
- assign(beg, end); //将[beg, end)区间中的数据拷贝给当前deque
- assign(n, elem); //将n个elem拷贝赋值给本身
- #include
- #include
- using namespace std;
-
- void print(const deque<int>& d)
- {
- for (deque<int>::const_iterator it = d.begin(); it < d.end(); it++)
- {
- cout << *it << " ";
- }
- cout << endl;
- }
-
- int main()
- {
- // STL - deque - 赋值操作
- /*函数原型:
- 1、deque& operator=(const deque& deq); //重载运算符=
- 2、assign(beg, end); //将[beg, end)区间中的数据拷贝给当前deque
- 3、assign(n, elem); //将n个elem拷贝赋值给本身
- */
-
- deque<int> d;
- for (int i = 0; i < 5; i++)
- {
- d.push_front(i + 1);
- }
- print(d);
-
- //1、deque& operator=(const deque& deq);
- deque<int> d1;
- d1 = d;
- print(d1);
-
- //2、assign(beg, end);
- deque<int>::iterator it = d1.begin();
- it++;
- deque<int> d2;
- d2.assign(it, d1.end());
- print(d2);
-
- //3、assign(n, elem);
- deque<int> d3;
- d3.assign(5, 8);
- print(d3);
-
- system("pause");
-
- return 0;
- }
输出结果
5 4 3 2 1
5 4 3 2 1
4 3 2 1
8 8 8 8 8
函数原型:
- deque.empty(); //判断容器是否为空
- deque.size(); //返回容器中元素个数
- deque.resize(num); //重新指定容器的长度为num,若容器变长,则以默认值填充新位置;如果容器变短,则末尾超出容器长度的元素被删除
- deque.resize(num, elem); //重新指定容器的长度为num,若容器变长,则以elem值填充新位置;如果容器变短,则末尾超出容器长度的元素被删除
- #include
- #include
- using namespace std;
-
- void print(const deque<int>& d)
- {
- for (deque<int>::const_iterator it = d.begin(); it < d.end(); it++)
- {
- cout << *it << " ";
- }
- cout << endl;
- }
-
- int main()
- {
- // STL - deque - 大小操作
- /*函数原型:
- 1、deque.empty(); //判断容器是否为空
- 2、deque.size(); //返回容器中元素个数
- 3、deque.resize(num); //重新指定容器的长度为num,若容器变长,则以默认值填充新位置;如果容器变短,则末尾超出容器长度的元素被删除
- 4、deque.resize(num, elem); //重新指定容器的长度为num,若容器变长,则以elem值填充新位置;如果容器变短,则末尾超出容器长度的元素被删除
- */
-
- deque<int> d;
- //1、deque.empty();
- cout << "1、容器是否为空:" << (d.empty() ? "是" : "否") << endl;
-
- for (int i = 0; i < 5; i++)
- {
- d.push_front(i + 1);
- }
- cout << "1、容器初始化元素:";
- print(d);
- cout << "1、容器是否为空:" << (d.empty() ? "是" : "否") << endl;
-
- //2、deque.size();
- cout << "2、容器中元素个数:" << d.size() << endl;
-
- //3、deque.resize(num);
- d.resize(8);
- cout << "3、容器长度变长后大小:" << d.size() << ",元素:";
- print(d);
-
- d.resize(3);
- cout << "3、容器长度变短后大小:" << d.size() << ",元素:";
- print(d);
-
- //4、deque.resize(num, elem);
- d.resize(9, 10);
- cout << "4、容器长度变长后大小:" << d.size() << ",元素:";
- print(d);
-
- d.resize(5, 6);
- cout << "4、容器长度变短后大小:" << d.size() << ",元素:";
- print(d);
-
- system("pause");
-
- return 0;
- }
输出结果
1、容器是否为空:是
1、容器初始化元素:5 4 3 2 1
1、容器是否为空:否
2、容器中元素个数:5
3、容器长度变长后大小:8,元素:5 4 3 2 1 0 0 0
3、容器长度变短后大小:3,元素:5 4 3
4、容器长度变长后大小:9,元素:5 4 3 10 10 10 10 10 10
4、容器长度变短后大小:5,元素:5 4 3 10 10
函数原型:
两端操作:
- 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)区间的数据,无返回值
- erase(pos); //删除pos位置的数据,返回下一个数据的位置
- erase(beg, end); //删除[beg, end)区间的数据,返回下一个数据的位置
- clear(); //清空容器中所有数据
- #include
- #include
- using namespace std;
-
- void print(const deque<int>& d)
- {
- for (deque<int>::const_iterator it = d.begin(); it < d.end(); it++)
- {
- cout << *it << " ";
- }
- cout << endl;
- }
-
- int main()
- {
- // STL - deque - 插入和删除
- /*函数原型:
- 两端操作:
- 1、push_back(elem); //在容器尾部添加一个数据
- 2、push_front(elem); //在容器头部插入一个数据
- 3、pop_back(); //删除容器最后一个数据
- 4、pop_front(); //删除容器第一个数据
- 指定位置操作:
- 5、insert(pos, elem); //在pos位置插入一个elem元素的拷贝,返回新数据的位置
- 6、insert(pos, n, elem); //在pos位置插入n个elem数据,无返回值
- 7、insert(pos, beg, end); //在pos位置插入[beg, end)区间的数据,无返回值
- 8、erase(pos); //删除pos位置的数据,返回下一个数据的位置
- 9、erase(beg, end); //删除[beg, end)区间的数据,返回下一个数据的位置
- 10、clear(); //清空容器中所有数据
- */
-
- deque<int> d;
- //1、push_back(elem);
- for (int i = 0; i < 3; i++)
- {
- d.push_back(i + 1);
- }
-
- cout << "1、尾部添加3个数据,当前元素:";
- print(d);
-
- //2、push_front(elem);
- for (int i = 10; i < 15; i++)
- {
- d.push_front(i + 1);
- }
-
- cout << "2、头部插入5个数据,当前元素:";
- print(d);
-
- //3、pop_back();
- d.pop_back();
- cout << "3、尾部删除1个数据,当前元素:";
- print(d);
-
- //4、pop_front();
- d.pop_front();
- cout << "4、头部删除1个数据,当前元素:";
- print(d);
-
- //5、insert(pos, elem);
- deque<int>::iterator pos = d.insert(d.begin(), 99);
- cout << "5、在第1位置添加数据,当前元素:";
- print(d);
-
- //6、insert(pos, n, elem);
- d.insert(pos, 3, 88);
- cout << "6、在第1位置添加数据,当前元素:";
- print(d);
-
- //7、insert(pos, beg, end)
- deque<int> d2;
- d2.push_back(1);
- d2.push_back(2);
-
- pos = d.insert(d.begin(), d2.begin(), d2.end());
- cout << "7、在第1位置添加数据,当前元素:";
- print(d);
-
- //8、erase(pos);
- d.erase(pos);
- cout << "8、删除第1位置数据,当前元素:";
- print(d);
-
- //9、erase(beg, end);
- pos = d.begin();
- pos++;
- d.erase(pos, d.end());
- cout << "9、删除第2位置至尾区间数据,当前元素:";
- print(d);
-
- //10、clear();
- d.clear();
- cout << "10、清空数据,容器大小:" << d.size() << ",当前元素:";
- print(d);
-
- system("pause");
-
- return 0;
- }
输出结果
1、尾部添加3个数据,当前元素:1 2 3
2、头部插入5个数据,当前元素:15 14 13 12 11 1 2 3
3、尾部删除1个数据,当前元素:15 14 13 12 11 1 2
4、头部删除1个数据,当前元素:14 13 12 11 1 2
5、在第1位置添加数据,当前元素:99 14 13 12 11 1 2
6、在第1位置添加数据,当前元素:88 88 88 99 14 13 12 11 1 2
7、在第1位置添加数据,当前元素:1 2 88 88 88 99 14 13 12 11 1 2
8、删除第1位置数据,当前元素:2 88 88 88 99 14 13 12 11 1 2
9、删除第2位置至尾区间数据,当前元素:2
10、清空数据,容器大小:0,当前元素:
函数原型:
- at(int idx); //返回索引idx所指的数据
- operator[]; //返回索引idx所指的数据
- front(); //返回容器中第一个数据元素
- back(); //返回容器中最后一个数据元素
- #include
- #include
- using namespace std;
-
- void print(const deque<int>& d)
- {
- for (deque<int>::const_iterator it = d.begin(); it < d.end(); it++)
- {
- cout << *it << " ";
- }
- cout << endl;
- }
-
- int main()
- {
- // STL - deque - 数据读取
- /*函数原型:
- 1、at(int idx); //返回索引idx所指的数据
- 2、operator[]; //返回索引idx所指的数据
- 3、front(); //返回容器中第一个数据元素
- 4、back(); //返回容器中最后一个数据元素
- */
-
- deque<int> d;
- for (int i = 0; i < 5; i++)
- {
- d.push_back(i + 1);
- }
- cout << "容器中的元素:";
- print(d);
-
- //1、at(int idx);
- cout << "1、读取第3个元素:" << d.at(2) << endl;
-
- //2、operator[];
- cout << "2、读取第2个元素:" << d[1] << endl;
-
- //3、front();
- cout << "3、读取第一个元素:" << d.front() << endl;
-
- //4、back();
- cout << "4、读取最后一个元素:" << d.back() << endl;
-
- system("pause");
-
- return 0;
- }
输出结果
容器中的元素:1 2 3 4 5
1、读取第3个元素:3
2、读取第2个元素:2
3、读取第一个元素:1
4、读取最后一个元素:5
算法:
- sort(iterator beg, iterator end); //对beg和end区间内元素进行排序
默认升序排序,对于支持随机访问的迭代器的容器(如vector, deque),都可以使用sort进行排序。
- #include
- #include
- #include
- using namespace std;
-
- void print(const deque<int>& d)
- {
- for (deque<int>::const_iterator it = d.begin(); it < d.end(); it++)
- {
- cout << *it << " ";
- }
- cout << endl;
- }
-
- int main()
- {
- // STL - deque - 排序
- /*算法:
- sort(iterator beg, iterator end); //对beg和end区间内元素进行排序
- */
-
- deque<int> d;
- d.push_back(33);
- d.push_back(26);
- d.push_back(75);
- d.push_back(18);
- d.push_back(89);
-
- cout << "容器中的元素:";
- print(d);
-
- //排序 - 默认升序排序
- sort(d.begin(), d.end());
- cout << "排序后,容器中的元素:";
- print(d);
-
- system("pause");
-
- return 0;
- }
输出结果
容器中的元素:33 26 75 18 89
排序后,容器中的元素:18 26 33 75 89
stack是一种先进后出(First In Last Out, FILO)的数据结构,它只有一个出囗,且入囗与出囗共用一个。栈中只有顶端的元素才可以被外界使用,因此栈不允许有遍历行为。栈可以为空,也可以返回栈中的元素个数。栈中进入数据称为入栈(push),弹出数据称为出栈(pop),如下图所示:

函数原型:
构造函数
- stack
stk; //stack采用模板类实现,stack对象的默认构造形式 - stack(const stack& stk); //拷贝构造函数
赋值操作
- stack& operator=(const stack& stk); //重载运算符=
数据存取
- push(elem); //向栈顶添加元素
- pop(); //从栈顶移除第一个元素
- top(); //返回栈顶元素
大小操作
- empty(); //判断堆栈是否为空
- size(); //返回栈大小
- #include
- #include
- using namespace std;
-
- int main()
- {
- // STL - stack - 常用接囗
- /*函数原型:
- 构造函数
- 1、stack
stk; //stack采用模板类实现,stack对象的默认构造形式 - 2、stack(const stack& stk); //拷贝构造函数
- 赋值操作
- 3、stack& operator=(const stack& stk); //重载运算符=
- 数据存取
- 4、push(elem); //向栈顶添加元素
- 5、pop(); //从栈顶移除第一个元素
- 6、top(); //返回栈顶元素
- 大小操作
- 7、empty(); //判断堆栈是否为空
- 8、size(); //返回栈大小
- */
-
- //1、stack
stk; - stack<int> s1;
-
- //7、empty(); //判断堆栈是否为空
- cout << "7、栈是否为空:" << (s1.empty() ? "是" : "否") << endl;
-
- //4、push(elem); //向栈顶添加元素
- s1.push(20);
- s1.push(17);
-
- //8、size(); //返回栈大小
- cout << "8、栈大小:" << s1.size() << endl;
-
- //6、top(); //返回栈顶元素
- cout << "6、栈顶元素:" << s1.top() << endl;
-
- //5、pop(); //从栈顶移除第一个元素
- s1.pop();
- cout << "5、移除栈顶元素后,栈大小:" << s1.size() << endl;
-
- //2、stack(const stack& stk); //拷贝构造函数
- stack<int> s2(s1);
- cout << "2、通过拷贝构造函数初始化栈,栈大小:" << s1.size() << endl;
-
- //3、stack& operator=(const stack& stk); //重载运算符=
- stack<int> s3;
- s3 = s2;
- cout << "3、通过重载运算符=赋值栈,栈大小:" << s1.size() << endl;
-
- system("pause");
-
- return 0;
- }
输出结果
7、栈是否为空:是
8、栈大小:2
6、栈顶元素:17
5、移除栈顶元素后,栈大小:1
2、通过拷贝构造函数初始化栈,栈大小:1
3、通过重载运算符=赋值栈,栈大小:1
queue是一种先进先出(First In First Out, FIFO)的数据结构,它有两个出囗,只有队头和队尾能被外界访问,因此不允许有遍历 为,可以判断队列是否为空,也可以返回队列大小,如下图所示:

构造函数
- queue
que; //queue采用模板类实现,queue对象的默认构造形式 - queue(const queue& que); //拷贝构造函数
赋值操作
- queue& operator(const queue& que); //重载运算符=
数据存取
- push(elem); //向队尾添加元素
- pop(); //从队头移除第一个元素
- back(); //返回最后一个元素
- front(); //返回第一个元素
大小操作
- empty(); //判断队列是否为空
- size(); //返回栈大小
- #include
- #include
- using namespace std;
-
- int main()
- {
- // STL - queue - 常用接囗
- /*函数原型:
- 构造函数
- 1、queue
que; //queue采用模板类实现,queue对象的默认构造形式 - 2、queue(const queue& que); //拷贝构造函数
- 赋值操作
- 3、queue& operator(const queue& que); //重载运算符=
- 数据存取
- 4、push(elem); //向队尾添加元素
- 5、pop(); //从队头移除第一个元素
- 6、back(); //返回最后一个元素
- 7、front(); //返回第一个元素
- 大小操作
- 8、empty(); //判断队列是否为空
- 9、size(); //返回栈大小
- */
-
- //1、queue
que; 默认构造函数 - queue<int> q1;
-
- //4、push(elem); //向队尾添加元素
- q1.push(22);
- q1.push(16);
- q1.push(67);
-
- //9、size(); //返回栈大小
- cout << "9、添加元素后,队列大小:" << q1.size() << endl;
-
- //6、back(); //返回最后一个元素
- cout << "6、最后一个元素:" << q1.back() << endl;
-
- //7、front(); //返回第一个元素
- cout << "7、第一个元素:" << q1.front() << endl;
-
- //2、queue(const queue & que); //拷贝构造函数
- queue<int> q2(q1);
- cout << "2、拷贝构造函数,队列大小:" << q1.size() << endl;
-
- //3、queue& operator(const queue& que); //重载运算符=
- queue<int> q3 = q1;
- cout << "3、重载运算符=,队列大小:" << q1.size() << endl;
-
- cout << "8、重载运算符=,队列是否为空:" << (q1.empty() ? "是" : "否") << endl;
-
- //8、empty(); //判断队列是否为空
- while (!q1.empty())
- {
- //5、pop(); //从队头移除第一个元素
- q1.pop();
- }
- cout << "5、移除所有元素后,队列大小:" << q1.size() << endl;
-
- system("pause");
-
- return 0;
- }
输出结果
9、添加元素后,队列大小:3
6、最后一个元素:67
7、第一个元素:22
2、拷贝构造函数,队列大小:3
3、重载运算符=,队列大小:3
8、重载运算符=,队列是否为空:否
5、移除所有元素后,队列大小:0