
点击蓝字 关注我们

第六节 deque容器

deque容器是双端队列容器,它允许在两端快速插入和删除元素。
与上节所学的vector容器相比较,他们有以下区别:
1.内部实现:
vector容器使用动态数组实现,元素在内存中是连续存储的,支持快速的随机访问。deque容器使用块状结构实现。它由多个块组成,每个块都是一个独立的数组,支持在两端快速插入和删除。
2.内存分配:
vector 在内存上的布局更加紧凑,因为它使用单个动态数组。而deque容器由于使用了块状结构,其内存布局可能相对分散,每个块独立分配内存。
3.随机访问:
vector容器支持高效的随机访问,因为元素在内存中是连续存储的。同样的,deque容器也支持随机访问,但相对于vector,其性能可能稍逊一筹,因为需要在块之间进行跳跃。
4.两端操作:
deque容器允许在两端进行高效的插入和删除操作。通过push_front和pop_front在前端进行操作,通过push_back和pop_back在后端进行操作。而vector容器在尾部进行操作效率很高,但在头部进行插入或删除可能较慢,因为需要移动大量元素。
5.内存大小:
vector容器通常占用的内存空间较少,因为它没有额外的块间指针。而deque容器可能会占用更多的内存,因为每个块都需要额外的指针来连接。
了解了deque容器的特点后,我们再看一些deque容器的相关操作:
1.包含头文件:
#include<deque>
2.插入与删除元素:
在deque容器中,我们可以使用下面方式去插入或删除元素:
push_front()在双端队列的头部插入元素。
pop_front()移除双端队列头部的元素。
push_back()在双端队列的尾部插入元素。
pop_back()移除双端队列尾部的元素。
#include<iostream>using namespace std;#include<deque>void print( deque<int> d) {for (deque<int>::iterator it = d.begin(); it != d.end(); it++){cout << *it << " ";}cout << endl;}int main() {deque<int>d1;d1.push_back(10);d1.push_back(20);cout << "尾插两个元素后:";print(d1);d1.push_front(30);d1.push_front(40);cout << "头插两个元素后:";print(d1);d1.pop_back();cout << "尾删一个元素后:";print(d1);d1.pop_front();cout << "头删一个元素后:";print(d1);system("pause");return 0;}
结果如下:
尾插两个元素后:10 20头插两个元素后:40 30 10 20尾删一个元素后:40 30 10头删一个元素后:30 10
我们还可以使用insert()在指定位置插入元素:
deque<int>d1;d1.push_back(10);d1.push_back(20);d1.push_front(30);d1.push_front(40);print(d1);//在首元素之前插入两个99d1.insert(d1.begin(), 2, 99);print(d1);//在第一个元素后插入一个66d1.insert(d1.begin() + 1, 66);print(d1);//在尾元素后插入一个200d1.insert(d1.end(), 200);print(d1);
结果如下:
40 30 10 2099 99 40 30 10 2099 66 99 40 30 10 2099 66 99 40 30 10 20 200
同理,erase()也是类似vector的操作,这里就不做一一演示,读者可以自己尝试操作一下。
我们还可以把一个容器中的元素插入到另一个容器中;
deque<int>d1 = { 10,20,30,40 };print(d1);//创建d2容器,内容为5个10deque<int>d2(5,10);print(d2);//把d1的首元素到尾元素插入到d2的begin位置d2.insert(d2.begin(), d1.begin(), d1.end());print(d2);
结果如下:
10 20 30 4010 10 10 10 1010 20 30 40 10 10 10 10 10
3.assign赋值操作:
assign(beg,end)把beg到end的元素赋值给容器。
assign(n,elem)把n个elem赋值给容器。
deque<int>d1 = { 10,20,30,40 };print(d1);deque<int>d2;d2.assign(5, 100);print(d2);d2.assign(d1.begin(), d1.end());print(d2);
结果如下:
10 20 30 40100 100 100 100 10010 20 30 40
4.访问元素:
使用下标或at操作符,与vector操作相同。
deque<int>d1;d1.push_back(10);d1.push_back(20);d1.push_front(30);d1.push_front(40);print(d1);cout << "第2个元素为:" << d1[1] << endl;cout << "第3个元素为:" << d1.at(2) << endl;
结果如下:
40 30 10 20第2个元素为:30第3个元素为:10
5.容量操作:
size()返回双端队列中的元素数量,deque容器没有capacity的概念。
empty()检查双端队列是否为空。
clear()移除双端队列中的所有元素。
deque<int>d1;d1.push_back(10);d1.push_back(20);d1.push_front(30);d1.push_front(40);print(d1);cout << "d1的大小为:" << d1.size() << endl;cout << (d1.empty() ? "d1为空" : "d1不为空") << endl;d1.clear();print(d1);
结果如下:
40 30 10 20d1的大小为:4d1不为空
deque容器和vector容器在许多功能上是相似的。读者可以尝试练习一下。总的来说,vector是一个在随机访问、插入和删除操作方面更加灵活的容器,而deque则更适合在两端进行高效的插入和删除操作。在实际操作中按照需求去使用容器即可。
deque容器的讲解到此结束,感谢观看!欢迎各位的点赞与关注!您的点赞和关注是我学习更新的动力!有问题可在后台留言。
END
往期推荐
C++高级学习:第五节-vector容器(下)
C++高级学习:第四节-Vector容器(上)
C++高级学习:第三节-STL概述
C++高级学习:第二节-模板注意事项

分享、在看与点赞,至少我要拥有一个吧




