无人问津的日子,我为自己喝彩!
文章目录
- 1. 基本概念
- 1.1 功能
- 1.2 与`vector`区别
- 1.3 图解
- 1.4 内部工作原理
- 1.5 `deque` 容器的迭代器也是支持随机访问的
- 2. 构造函数
- 2.1 函数原型
- 2.2 代码展示
- 2.3 测试结果
- 2.4 小think
- 2.4.1 小问题
- 2.4.2 思路
- 2.4.3 修改
- 2.4.4 测试
- 3. 赋值操作
- 3.1 函数原型
- 3.2 代码展示
- 3.3 测试结果
- 4. 大小操作
- 4.1 函数原型
- 4.2 代码展示
- 4.3 测试结果
- 5. 插入操作
- 5.1 两端插入操作
- 5.1.1 函数原型
- 5.1.2 代码展示
- 5.1.3 测试结果
- 5.2 指定位置操作
- 5.2.1 函数原型
- 5.2.2 代码展示
- 5.2.3 测试结果
- 6. 删除操作
- 6.1 函数原型
- 6.2 代码展示
- 6.3 测试结果
- 7. 数据存取操作
- 7.1 函数原型
- 7.2 代码展示
- 7.3 测试结果
- 8. 排序操作
- 8.1 sort算法
- 8.2 代码展示
- 8.3 测试结果
- 9. 明日计划
- 10. 感谢大家支持!!!😉😉😉
1. 基本概念
1.1 功能
- 双端数组,可以对头端进行插入删除操作
1.2 与vector
区别
vector
对于头部的插入删除效率低,数据量越大,效率越低deque
相对而言,对头部的插入删除速度会比vector快vector
访问元素的速度会deque
快,这和两者内部实现有关
1.3 图解
1.4 内部工作原理
deque
内部有一个中控器,维护每段缓冲区中的内容,缓冲区中存放真实的数据- 中控器维护的是每个缓冲区的地址,使得使用
deque
时像一片连续的内存空间
1.5 deque
容器的迭代器也是支持随机访问的
2. 构造函数
2.1 函数原型
deque<T> deqT;
默认构造形式deque(beg, end);
构造函数将[beg, end)区间元素拷贝给本身deque(n, elem);
构造函数将n个elem拷贝给本身deque(const deque &deq);
拷贝构造函数
2.2 代码展示
#include<deque>
#include<iostream>
#include<stdio.h>
using namespace std;
void printDeque(const deque<int> d) { //遍历打印输出
for (deque<int>::const_iterator it = d.begin(); it != d.end(); it++) {
cout << (*it) << " ";
}
cout << endl;
}
void text01() {
deque<int> d1;
for (int i = 0; i < 10; i++) {
d1.push_back(i);
}
cout << "d1=";
printDeque(d1);
//构造函数将d1元素拷贝给d2
deque<int>d2(d1.begin(),d1.end());
cout << "d2=";
printDeque(d2);
deque<int>d3(10, 3);
cout << "d3=";
printDeque(d3);
deque<int>d4(d3);
cout << "d4=";
printDeque(d4);
}
int main() {
text01();
return 0;
}
2.3 测试结果
2.4 小think
2.4.1 小问题
我们知道,迭代器可以对容器中的数据进行读写操作,通过迭代器it我们可以读取容器中的元素,但可能不经意之间也会对其修改。但如何才能只读取并避免进行修改呢???
2.4.2 思路
- 当我们用const限制传入的deque的地址时,会发现报错了捏——不存在……的转换
- 此时我们分析报错内容,大概就是不存在const_iterator到iterator的转换,也就是传入时的迭代器就是const只能读取不能修改的,所以使用时也应是只读迭代器,而不是普通的迭代器。
2.4.3 修改
当我们把迭代器改为只读迭代器时,发现不再报错了欸
2.4.4 测试
当我们尝试用迭代器对数据进行修改时,发现报错了——表达式必须是可修改的左值,也就是该迭代器访问数据时,只能读取,不能修改,我们的目的达到了!!
3. 赋值操作
鉴于
deque
与vector
的赋值操作基本类似,本篇就不详细讲了,带着大家敲击行代码就好了,详细内容请见👉👉👉 Day07 C++STL入门基础知识四——vector容器(上) 基本概念-构造函数-赋值操作-容量大小【全面深度剖析+例题代码展示】eiO
3.1 函数原型
deque& operator=(const deque &deq);
重载等号操作符assign(beg, end);
将[beg, end)区间中的数据拷贝赋值给本身assign(n, elem);
将n个elem拷贝赋值给本身
3.2 代码展示
#include<deque>
#include<iostream>
#include<stdio.h>
using namespace std;
void printDeque(const deque<int> d) { //遍历打印输出
for (deque<int>::const_iterator it = d.begin(); it != d.end(); it++) {
cout << (*it) << " ";
}
cout << endl;
}
void text02() {
deque<int>d1;
for (int i = 0; i < 10; i++) {
d1.push_back(i);
}
//=赋值
deque<int>d2;
d2 = d1;
cout << "d2=";
printDeque(d2);
//assign赋值
deque<int>d3;
d3.assign(d1.begin() + 2, d1.end());
cout << "d3=";
printDeque(d3);
//n个ele赋值
deque<int>d4;
d4.assign(10, 4);
cout << "d4=";
printDeque(d4);
}
int main() {
//text01();
text02();
return 0;
}
3.3 测试结果
4. 大小操作
4.1 函数原型
deque.empty();
判断容器是否为空- 如果为空,则返回true
- 不为空,则返回false
size()
返回容器元素中的个数resize(int num);
重新指定容器的长度为num- 若容器变长,则以默认值0填充新的位置;
- 如果容器变短,则末尾超出容器长度的元素被删除;
- resize(int num, elem); 重新定义容器的长度为num
- 若容器变长,则以elem值填充新位置;
- 如果容器变短,则末尾超出容器长度的元素被删除;
与
vecor
不同,deque
是双端数组,所以可以在头尾两端无限插入读取数据,所以就没有固定的容量
4.2 代码展示
#include<deque>
#include<iostream>
#include<stdio.h>
using namespace std;
void printDeque(const deque<int> d) { //遍历打印输出
for (deque<int>::const_iterator it = d.begin(); it != d.end(); it++) {
cout << (*it) << " ";
}
cout << endl;
}
//deque容器大小操作
void text03() {
deque<int> d1;
for (int i = 0; i < 10; i++) {
d1.push_back(i);
}
printDeque(d1);
//判空
if (d1.empty())
cout << "d1为空" << endl;
else
cout << "d1为非空" << endl;
//大小
int size = d1.size();
cout << "d1的大小为:" << size << endl;
//重新指定大小【扩大】
d1.resize(15);
cout << "个数扩大为15时:";
printDeque(d1);
//重载指定大小
d1.resize(20, 123);
cout << "重载扩大为20时:";
printDeque(d1);
//重新指定大小【缩小】
d1.resize(8);
cout << "缩小为8时:";
printDeque(d1);
}
int main() {
//text01();
//text02();
text03();
return 0;
}
4.3 测试结果
5. 插入操作
5.1 两端插入操作
5.1.1 函数原型
push_back(elem)
在容器尾部添加一个数据push_front(elem);
在容器头部插入一个数据pop_back();
删除容器最后一个数据pop_front();
删除容器第一个数据
5.1.2 代码展示
#include<deque>
#include<iostream>
#include<stdio.h>
using namespace std;
void printDeque(const deque<int> d) { //遍历打印输出
for (deque<int>::const_iterator it = d.begin(); it != d.end(); it++) {
cout << (*it) << " ";
}
cout << endl;
}
void text04() {
deque<int>d1;
//尾插
d1.push_back(10);
d1.push_back(20);
d1.push_back(30);
printDeque(d1); //10 20 30
//头插
d1.push_front(5);
d1.push_front(0);
printDeque(d1); //0 5 10 20 30
//尾删
d1.pop_back();
printDeque(d1); // 0 5 10 20
//头删
d1.pop_front();
printDeque(d1); //5 10 20
}
int main(){
text04();
return 0;
}
5.1.3 测试结果
5.2 指定位置操作
5.2.1 函数原型
insert(pos,elem);
在pos位置插入一个elem元素拷贝,返回新数据的位置insert(pos, n, elem);
在pos位置插入n个elem数据,无返回值insert(pos, beg, end);
在pos位置插入[beg, end)区间的数据,无返回值
5.2.2 代码展示
#include<deque>
#include<iostream>
#include<stdio.h>
using namespace std;
void printDeque(const deque<int> d) { //遍历打印输出
for (deque<int>::const_iterator it = d.begin(); it != d.end(); it++) {
cout << (*it) << " ";
}
cout << endl;
}
void text05() {
deque<int> d1;
d1.push_back(10);
d1.push_back(20);
d1.push_front(100);
d1.push_front(200);
printDeque(d1);
//200 100 20 10
//insert插入
d1.insert(d1.begin(), 400);
printDeque(d1);
//insert重载
d1.insert(d1.begin(), 2, 600);
printDeque(d1);
//insert区间插入
deque<int>d2;
d2.push_back(1);
d2.push_back(2);
d2.push_back(3);
d1.insert(d1.begin(), d2.begin(), d2.end());
printDeque(d1);
}
int main(){
text05();
return 0;
}
5.2.3 测试结果
6. 删除操作
6.1 函数原型
clear();
清空容器所有数据erase(beg, end);
删除[beg,end)区间的数据,返回下一个数据的位置erase(pos);
删除pos位置的数据,返回下一个数据的位置
6.2 代码展示
#include<deque>
#include<iostream>
#include<stdio.h>
using namespace std;
void printDeque(const deque<int> d) { //遍历打印输出
for (deque<int>::const_iterator it = d.begin(); it != d.end(); it++) {
cout << (*it) << " ";
}
cout << endl;
}
//删除
void text06() {
deque<int> d1;
for (int i = 0; i < 10; i++) {
d1.push_back(i);
}
printDeque(d1);
//头尾删
d1.pop_front();
printDeque(d1);
d1.pop_back();
printDeque(d1);
//迭代器删除指定位置 it+=pos
deque<int>::iterator it = d1.begin();
it++;
d1.erase(it);
printDeque(d1);
//按照区间的方式删除
d1.erase(it , d1.end()-2);
printDeque(d1);
//清空
cout << "使用clear()清空为:";
d1.clear();
printDeque(d1);
for (int i = 0; i < 10; i++) {
d1.push_back(i);
}
printDeque(d1);
d1.erase(d1.begin(), d1.end());
cout << "使用erase()清空为:";
printDeque(d1);
}
int main(){
text06();
return 0;
}
6.3 测试结果
7. 数据存取操作
7.1 函数原型
at(int idx);
返回索引idx所指的元素operator[ ];
返回索引idx所指的数据front();
返回容器中第一个数据元素back();
返回容器中最后一个数据元素
7.2 代码展示
#include<deque>
#include<iostream>
#include<stdio.h>
using namespace std;
void printDeque(const deque<int> d) { //遍历打印输出
for (deque<int>::const_iterator it = d.begin(); it != d.end(); it++) {
cout << (*it) << " ";
}
cout << endl;
}
//数据存取
void text07() {
deque<int>d1;
for (int i = 0; i < 10; i++) {
d1.push_back(i);
}
d1.push_back(20);
d1.push_back(30);
d1.push_front(100);
d1.push_front(200);
int len = d1.size();
//通过[ ]访问
for (int i = 0; i < len; i++) {
cout << d1[i] << " ";
}
cout << endl;
//通过at方式访问
for (int i = 0; i < len; i++) {
cout << d1.at(i) << " ";
}
cout << endl;
//访问头尾元素
cout << "头元素为:" << d1.front() << endl;
cout << "尾元素为:" << d1.back() << endl;
}
int main(){
text07();
return 0;
}
7.3 测试结果
8. 排序操作
8.1 sort算法
sort(iterator beg, iterator end);
对beg和end区间元素进行排序- 包含头文件
#include<algorithm>
- 默认从小到大排【关于如何从大到小和如何自定义我们后面会讲到!!】
- 对于支持随机访问的迭代器的容器,都可以利用sort算法直接进行排序
8.2 代码展示
#include<iostream>
#include<stdio.h>
#include<deque>
#include<algorithm>
using namespace std;
void printDeque(const deque<int> d) { //遍历打印输出
for (deque<int>::const_iterator it = d.begin(); it != d.end(); it++) {
cout << (*it) << " ";
}
cout << endl;
}
void text08() {
deque<int> d1;
d1.push_back(100);
d1.push_back(60);
d1.push_back(90);
d1.push_front(200);
d1.push_front(10);
d1.push_front(300);
cout << "排序前:";
printDeque(d1);
//排序
deque<int>::iterator it = d1.begin();
int size = d1.size();
sort(it, it + size);
//或者sort(d1.begin(),d1.end());
cout << "排序后:";
printDeque(d1);
}
int main(){
text08();
return 0;
}
8.3 测试结果
9. 明日计划
- 线代第一章提高题+三1
- 蓝桥杯*5
- STL stack+queue容器
- 高代七1、2