C++高级学习:第六节-deque容器

  [微信公众号: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容器的讲解到此结束,感谢观看!欢迎各位的点赞与关注!您的点赞和关注是我学习更新的动力!有问题可在后台留言。

  • 14
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值