STL容器操作--deque详解_dequestl-程序员宅基地

技术标签: C++  容器  STL  

1、deque简介

  • deque是“double-ended queue”的缩写,和vector一样都是STL的容器,deque是双端数组,而vector是单端的。
  • deque在接口上和vector非常相似,在许多操作的地方可以直接替换。
  • deque可以随机存取元素(支持索引值直接存取, 用[]操作符或at()方法,这个等下会详讲)。
  • deque头部和尾部添加或移除元素都非常快速。但是在中部安插元素或移除元素比较费时。
  • #include <deque> 

deque对象的默认构造

deque采用模板类实现,deque对象的默认构造形式:deque<T> deqT; 

deque <int> deqInt;            //一个存放int的deque容器。

deque <float> deq Float;     //一个存放float的deque容器。

deque <string> deq String;     //一个存放string的deque容器。

...                                   

 //尖括号内还可以设置指针类型或自定义类型。

 

2、deque末尾的添加移除操作

理论知识:

  • deque.push_back(elem);   //在容器尾部添加一个数据
  • deque.push_front(elem);   //在容器头部插入一个数据
  • deque.pop_back();                  //删除容器最后一个数据
  • deque.pop_front();              //删除容器第一个数据

 

deque<int> deqInt;

         deqInt.push_back(1);

         deqInt.push_back(3);

         deqInt.push_back(5);

         deqInt.push_back(7);

         deqInt.push_back(9);

         deqInt.pop_front();

         deqInt.pop_front();

         deqInt.push_front(11);

         deqInt.push_front(13);

         deqInt.pop_back();

         deqInt.pop_back();

//deqInt  { 13,11,5}

 

3、deque的数据存取

理论知识:

  • deque.at(idx);  //返回索引idx所指的数据,如果idx越界,抛出out_of_range。
  • deque[idx];  //返回索引idx所指的数据,如果idx越界,不抛出异常,直接出错。
  • deque.front();   //返回第一个数据。
  • deque.back();  //返回最后一个数据

                   deque<int> deqInt;

                   deqInt.push_back(1);

                   deqInt.push_back(3);

                   deqInt.push_back(5);

                   deqInt.push_back(7);

                   deqInt.push_back(9);

 

                   int iA = deqInt.at(0);                  //1

                   int iB = deqInt[1];                       //3

                   deqInt.at(0) = 99;                       //99

                   deqInt[1] = 88;                   //88

 

                   int iFront = deqInt.front();        //99

                   int iBack = deqInt.back();         //9

                   deqInt.front() = 77;                    //77

                   deqInt.back() = 66;                    //66

4、deque与迭代器

理论知识

  • deque.begin();  //返回容器中第一个元素的迭代器。
  • deque.end();  //返回容器中最后一个元素之后的迭代器。
  • deque.rbegin();  //返回容器中倒数第一个元素的迭代器。
  • deque.rend();   //返回容器中倒数最后一个元素之后的迭代器。

 

deque<int> deqInt;

                   deqInt.push_back(1);

                   deqInt.push_back(3);

                   deqInt.push_back(5);

                   deqInt.push_back(7);

                   deqInt.push_back(9);

 

                   for (deque<int>::iterator it=deqInt.begin(); it!=deqInt.end(); ++it)

                   {

                            cout << *it;

                            cout << "";

                   }

         // 1 3 5 7 9

 

                   for (deque<int>::reverse_iterator rit=deqInt.rbegin(); rit!=deqInt.rend(); ++rit)

                   {

                            cout << *rit;

                            cout << "";

                   }

         //9 7 5 3 1

5、deque对象的带参数构造

理论知识

  • deque(beg,end);    //构造函数将[beg, end)区间中的元素拷贝给本身。注意该区间是左闭右开的区间。
  • deque(n,elem);   //构造函数将n个elem拷贝给本身。
  • deque(const deque  &deq);  //拷贝构造函数。

 

deque<int> deqIntA;

                   deqIntA.push_back(1);

                   deqIntA.push_back(3);

                   deqIntA.push_back(5);

                   deqIntA.push_back(7);

                   deqIntA.push_back(9);

 

                   deque<int> deqIntB(deqIntA.begin(),deqIntA.end());              //1 3 5 7 9

                   deque<int> deqIntC(5,8);                                                                 //8 8 8 8 8

                   deque<int> deqIntD(deqIntA);                                                       //1 3 5 7 9

6、deque的赋值

理论知识

  • deque.assign(beg,end);    //将[beg, end)区间中的数据拷贝赋值给本身。注意该区间是左闭右开的区间。
  • deque.assign(n,elem);  //将n个elem拷贝赋值给本身。
  • deque& operator=(const deque &deq);    //重载等号操作符
  • deque.swap(deq);  // 将vec与本身的元素互换

 

deque<int> deqIntA,deqIntB,deqIntC,deqIntD;

                   deqIntA.push_back(1);

                   deqIntA.push_back(3);

                   deqIntA.push_back(5);

                   deqIntA.push_back(7);

                   deqIntA.push_back(9);

 

                   deqIntB.assign(deqIntA.begin(),deqIntA.end());     // 1 3 5 7 9

                  

                   deqIntC.assign(5,8);                                                        //8 8 8 8 8

 

                   deqIntD = deqIntA;                                                         //1 3 5 7 9

 

                   deqIntC.swap(deqIntD);                                                //互换

7、deque的大小

理论知识

  • deque.size();          //返回容器中元素的个数
  • deque.empty();     //判断容器是否为空
  • deque.resize(num);   //重新指定容器的长度为num,若容器变长,则以默认值填充新位置。如果容器变短,则末尾超出容器长度的元素被删除。
  • deque.resize(num, elem);  //重新指定容器的长度为num,若容器变长,则以elem值填充新位置。如果容器变短,则末尾超出容器长度的元素被删除。

 

                   deque<int> deqIntA;

                   deqIntA.push_back(1);

                   deqIntA.push_back(3);

                   deqIntA.push_back(5);

 

                   int iSize = deqIntA.size();  //3

 

                   if (!deqIntA.empty())

                   {

                            deqIntA.resize(5);             //1 3 5 0 0

                            deqIntA.resize(7,1); //1 3 5 0 0 1 1

                            deqIntA.resize(2);             //1 3

                   }

8、deque的插入

理论知识

  • deque.insert(pos,elem);   //在pos位置插入一个elem元素的拷贝,返回新数据的位置。
  • deque.insert(pos,n,elem);   //在pos位置插入n个elem数据,无返回值。
  • deque.insert(pos,beg,end);   //在pos位置插入[beg,end)区间的数据,无返回值。
deque<int> deqA;

         deque<int> deqB;



         deqA.push_back(1);

         deqA.push_back(3);

         deqA.push_back(5);

         deqA.push_back(7);

         deqA.push_back(9);



         deqB.push_back(2);

         deqB.push_back(4);

         deqB.push_back(6);

         deqB.push_back(8);

        

         deqA.insert(deqA.begin(), 11);                 //{11, 1, 3, 5, 7, 9}

         deqA.insert(deqA.begin()+1,2,33);           //{11,33,33,1,3,5,7,9}

         deqA.insert(deqA.begin() , deqB.begin() , deqB.end() );         //{2,4,6,8,11,33,33,1,3,5,7,9}

9、deque的删除

理论知识

  • deque.clear();    //移除容器的所有数据
  • deque.erase(beg,end);  //删除[beg,end)区间的数据,返回下一个数据的位置。
  • deque.erase(pos);    //删除pos位置的数据,返回下一个数据的位置。

 

删除区间内的元素

deqInt是用deque<int>声明的容器,现已包含按顺序的1,3,5,6,9元素。

deque<int>::iterator itBegin=deqInt.begin()+1;

deque<int>::iterator itEnd=deqInt.begin()+3;

deqInt.erase(itBegin,itEnd);

//此时容器deqInt包含按顺序的1,6,9三个元素。







假设 deqInt 包含1,3,2,3,3,3,4,3,5,3,删除容器中等于3的元素

for(deque<int>::iterator it=deqInt.being(); it!=deqInt.end(); )    //小括号里不需写  ++it

{

   if(*it == 3)

   {

        it  =  deqInt.erase(it);       //以迭代器为参数,删除元素3,并把数据删除后的下一个元素位置返回给迭代器。

         //此时,不执行  ++it; 

   }

   else

   {

       ++it;

   }

}



//删除deqInt的所有元素

deqInt.clear();                    //容器为空

参考:传智扫地僧讲义

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/Haiqiang1995/article/details/89765024

智能推荐

Optee中的ARM64平台上virt_to_phys函数的实现_virtual to physics函数-程序员宅基地

文章浏览阅读129次。在这篇文章中,我们将讨论Optee中virt_to_phys函数的实现,该函数用于将虚拟地址转换为物理地址。总结一下,Optee中的virt_to_phys函数通过解析页表项和应用ARM64的地址转换规则,实现了将虚拟地址转换为物理地址的功能。Optee中的virt_to_phys函数的作用就是根据当前页表的映射关系,将给定的虚拟地址转换为物理地址。在实际的代码中,还需要处理异常情况和错误检查,以确保函数的正确性和安全性。上述代码是Optee中virt_to_phys函数的简化版本,用于说明其实现逻辑。_virtual to physics函数

hdu-1686-Oulipo(KMP)_hdu - 1686-程序员宅基地

文章浏览阅读260次。OulipoTime Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 16577 Accepted Submission(s): 6640Problem DescriptionThe French author _hdu - 1686

SqlCommand.ExecuteNonQuery() 方法返回 -1-程序员宅基地

文章浏览阅读183次。不知道大家在使用ExecuteNonQuery方法的时候有没有碰到过返回-1的情况。ExecuteNonQuery方法返回增删改时,受影响的行数。那怎么会返回-1呢?查了一些资料后终于得知返回-1的原因。在进行增删改时,数据库能为我们统计受影响行数的前提条件是,关闭NOCOUNT,即 Set nocount off。默认情况下,它是关闭的,即我们是可以得到受影响的行数的。你可以测试如下..._command.executenonquery返回-1

wordpress 博客_如何通过WordPress博客获利-程序员宅基地

文章浏览阅读182次。wordpress 博客There are a small number of people who have made a fortune from setting up a blog and there are many more who dream of following suit. Unfortunately, to join the select group of high earne..._wordpress怎样盈利

usaco 5.5 Hidden Password(最小表示法求同构)_同构 usaco-程序员宅基地

文章浏览阅读1.4k次。Hidden PasswordACM South Eastern Europe -- 2003Sometimes the programmers have very strange ways of hiding their passwords. Billy "Hacker" Geits chooses a string S composed of L (5 <= L <= 100,_同构 usaco

Android简单的Fragment嵌套Fragment(Viewpager+Fragement)_安卓开发 frgament中嵌套fragment+viewpager-程序员宅基地

文章浏览阅读3.2k次,点赞4次,收藏14次。我的项目目录如下: 直接上核心代码 MainActivity import android.support.v4.app.FragmentTransaction; import android.graphics.Color; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentAc_安卓开发 frgament中嵌套fragment+viewpager

随便推点

学习编程真的会秃头吗???_编程人会秃头-程序员宅基地

文章浏览阅读870次。我们都说:学习计算机的人到一定岁数,会秃头,这是真的吗?我好害怕。。。其实吧?编程不背这黑锅,学编程的确实工作量大,工作时间长,用脑比较多,但是编程表示:这个黑锅我可担不起,其实吧,导致脱发的原因有很多:遗传性脱发:遗传性脱发也叫先天性脱发,这个是祖传的,只能认命,编程可背不起这个锅。对于男生来说,脱发,啊,好烦,因为一些基因或者激素的原因,更容易脱发。物理或者化学性脱发:物理性:长期接触放射源,长时间玩电脑手机,看电视等原因造成的物理性脱发。哇,这个锅编程能不能甩呢?回答当然是能的,现_编程人会秃头

总结:华科教授给本校2013级计算机学院硕士生论文提的几点意见_华科软件学院硕士论文-程序员宅基地

文章浏览阅读796次。1.论文标题最好要好好琢磨,去除“基于....的”定语后,分析主谓宾后的论文标题没有语法问题;2.论文标题不宜过大,比如“基于.....的手势识别”,但是手势识别的种类多,比如“基于...的手势识别模型”,“基于...的手势识别算法”等等;3.最好从论文的第二章开始讲自己的东西,而不要讲一些已经有的一些定义、定理等,答辩时老师只会关心,论文里你自己做了什么,创新点在哪;4.自己做的部分一定要写清楚..._华科软件学院硕士论文

文本分类知识_文本分析示意图-程序员宅基地

文章浏览阅读566次。文本分类概述 文本分类是在预定义的分类体系下,根据文本的特征(内容和属性),将给定文本与一个或者多个类别相关联的过程。最终目的是找到一个有效的映射函数,将输入的可视化文本映射为预定义分类体系下的一个或者多个类别。因此,文本分类有两个关键问题:一个是文本的表示,另一个就是分类器的设计。 **|输入文档|—> 预处理 —> **文本表示** —>..._文本分析示意图

vue 连接 MQTT 实现发布/订阅消息_vue使用mqtt定时器监测消息发送频率-程序员宅基地

文章浏览阅读163次。【代码】vue 连接 MQTT 实现发布/订阅消息。_vue使用mqtt定时器监测消息发送频率

mybatis mysql 中文乱码问题_mybatis xml select ifnull 中文乱码-程序员宅基地

文章浏览阅读1.6k次。在spring+mybatis开发中 遇到插入中文字符数据变成问号的问题1、一般第一步可能会去看spring项目中的web.xml是否设置了字符过滤器但是一看代码已经拷贝过来了啊 ┭┮﹏┭┮2、那会不会是tomcat中没有设置字符的问题?于是打开server.xml空欢喜 还是设置过了啊 ┭┮﹏┭┮3、对了还有个地方可能出问题 那就是数..._mybatis xml select ifnull 中文乱码

Qt_qt qgr-程序员宅基地

文章浏览阅读1.6k次。Qt维基百科,自由的百科全书Qt使用Qt Designer做GUI设计开发者Qt Project、诺基亚、Digia、KDE稳定版本5.0.1[1]/2013年1月31日;41天前预览版本5.0 RC2/2012年12月6日;3个月前编程语言_qt qgr