[微信公众号:Cpp入门到精通]有完整六十六节知识,STL知识总结,欢迎关注学习!!
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);
//在首元素之前插入两个99
d1.insert(d1.begin(), 2, 99);
print(d1);
//在第一个元素后插入一个66
d1.insert(d1.begin() + 1, 66);
print(d1);
//在尾元素后插入一个200
d1.insert(d1.end(), 200);
print(d1);
结果如下:
40 30 10 20
99 99 40 30 10 20
99 66 99 40 30 10 20
99 66 99 40 30 10 20 200
同理,erase()也是类似vector的操作,这里就不做一一演示,读者可以自己尝试操作一下。
我们还可以把一个容器中的元素插入到另一个容器中;
deque<int>d1 = { 10,20,30,40 };
print(d1);
//创建d2容器,内容为5个10
deque<int>d2(5,10);
print(d2);
//把d1的首元素到尾元素插入到d2的begin位置
d2.insert(d2.begin(), d1.begin(), d1.end());
print(d2);
结果如下:
10 20 30 40
10 10 10 10 10
10 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 40
100 100 100 100 100
10 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 20
d1的大小为:4
d1不为空
deque容器和vector容器在许多功能上是相似的。读者可以尝试练习一下。总的来说,vector是一个在随机访问、插入和删除操作方面更加灵活的容器,而deque则更适合在两端进行高效的插入和删除操作。在实际操作中按照需求去使用容器即可。
deque容器的讲解到此结束,感谢观看!欢迎各位的点赞与关注!您的点赞和关注是我学习更新的动力!有问题可在后台留言。