暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

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

Cpp入门到精通 2024-02-28
70

点击蓝字 关注我们

c++高级学习

第六节  deque容器


deque容器是双端队列容器,它允许在两端快速插入和删除元素。

与上节所学的vector容器相比较,他们有以下区别:

1.内部实现

vector容器使用动态数组实现,元素在内存中是连续存储的,支持快速的随机访问。deque容器使用块状结构实现。它由多个块组成,每个块都是一个独立的数组,支持在两端快速插入和删除。

2.内存分配

vector 在内存上的布局更加紧凑,因为它使用单个动态数组。而deque容器由于使用了块状结构,其内存布局可能相对分散,每个块独立分配内存。

3.随机访问: 

vector容器支持高效的随机访问,因为元素在内存中是连续存储的。同样的,deque容器也支持随机访问,但相对于vector,其性能可能稍逊一筹,因为需要在块之间进行跳跃。

4.两端操作

deque容器允许在两端进行高效的插入和删除操作。通过push_frontpop_front在前端进行操作,通过push_backpop_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容器的讲解到此结束,感谢观看!欢迎各位的点赞与关注!您的点赞和关注是我学习更新的动力!有问题可在后台留言。

                            END

                            往期推荐

                            C++高级学习:第五节-vector容器(下)

                            C++高级学习:第四节-Vector容器(上)

                            C++高级学习:第三节-STL概述

                            C++高级学习:第二节-模板注意事项


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

                            文章转载自Cpp入门到精通,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                            评论