STL中deque容器讲解

  • deque容器的实现
    • 相对于vector容器的区别
      • 原因:
      • deque内部工作原理
    • 构造函数
    • 容器操作
      • 插入操作
      • deque容器的遍历操作
      • 大小操作
      • 插入和删除
      • 数据存取
      • 容器元素排序

deque容器的实现

deque容器是STL中的一个重要的容器,它的实现的功能是一个双端数组,可以对两端数据进行插入和删除操作。

相对于vector容器的区别

deque容器相对于vector容器有着如下几个特点:

1.deque容器对头部的插入和删除操作比vector容器快;
2. 在访问元素时deque容器速度比vector容器速度慢;

原因:

vector容器是一个动态分配的连续内存空间,因此在对头部数据及逆行插入和删除时会造成大量数据的移动,但是在对数据进行访问时vector容器的又能做到快速的访问到容器中的指定元素。
deque容器的访问可如下图所示:

deque内部工作原理

deque内部有一个中控器,维护每段缓冲区的内容,缓冲区中存放真实数据。这使得deque容器并不是像vector容器那样是整个连续的内存空间,而是由多的内存空间片段组成,中控器记录下每个内存片段的首地址,使得deque对外就像是一段连续的存储空间。

这使其在头部插入删除元素很快,但是访问数据时速度不如vector
deque容器也支持随机存取功能

构造函数

deque容器有四种构造函数的形式,分别为

1.dequedeqT;


deque<int> deqT;

2.deque(begin, end);

deque<int>dequeT2(dequeT.begin(), dequeT.end());//将dequeT中从begin到end区间的元素复制到本容器中

3.deque(int n, elem);

deque<int>dequeT3(3,5);//向容器中插入3个5

4.deque(deque& dequeT);//拷贝构造函数

deque<int>dequeT4(dequeT3);//将dequeT3容器中的元素拷贝到dequeT4中

deque容器在使用是头文件需包含进来

#include<deque>

容器操作

插入操作

  • deque& operator=(deque& deqT);//重载operator=运算符
deque<int>deqT1;
T1.push_back(1);
deque<int>deqT2;
deqT2 = deqT1;
  • assign(begin,end)
deque<int>deqT3;
deqT3.assign(deqT1.begin(), deqT1.end());//将deqT2容器begin到end区间的元素拷贝到deqT3容器中
  • assign(int n, elem);
deque<int>deqT4;
deqT4.assign(3,6);//deqT4容器中的元素为6,6,6

deque容器的遍历操作

deque容器的遍历操作有三种方法vector容器的遍历操作与deque相同

  • while循环
//while循环的相关代码为
void printDeque(deque<T>& deqT)//T为数据类型,如果是内置数据类型则可以直接输出,如果是自定义数据类型则需注意需要重写cout<<左移运算符
{deque<T>::iterator begin = deqT.begin();deque<T>::iterator end = deqT.end();while(begin != end){cout<< *begin << endl;begin++;}
}
  • for循环
void dequePrint(deque<T>& v)
{for (deque<T>::iterator it = v.begin(); it != v.end(); it++){cout << *it << " ";}cout << endl;
}
//在上述函数中,如果要在函数体内无法修改容器元素的值,可改写为如下代码
void showVector(const deque<T>& v)//加入const关键字
{for (deque<T>::const_iterator it = v.begin(); it != v.end(); it++)//迭代器更改为const_iterator{//*it = 100; //此时就会报错,表达式是不可修改的左值cout << *it << " ";}cout << endl;
}
  • algorithm的for_each算法
//首先在使用algorithm算法时需要先将头文件包含进来
#include<algorithm>
//先要写一个自定义函数 ,这个自定义函数是后面供for_each使用的
void func(int val)
{cout<< val << endl;
}
//接着使用for_each方法
/*
这个函数的意思是从deqT.begin()到deqT.end()区间的元素每个元素都执行func(*begin())方法
*begin是将begin迭代器所指向的元素解析出来(具体关于for_each算法的定义可在VS环境下转到定义中查看)
*/
for_each(deqT.begin(),deqT.end(),func);

大小操作

  • empty(); //判空操

  • size()获取元素个数

  • resize(int n);//重新给元素指定个数n,不足的则用默认值补上,超过的则截取超出空间的元素

  • resize(int n, elem);//重新给元素指定个数n,不足的则用elem补上,超过的则截取超出空间的元素

deque<int> deqT;for (int i = 0; i < 10; i++){deqT.push_back(i + 1); }if (deqT.empty())//若容器为空,则返回true{cout << "这是空的" << endl;}else{cout << deqT.size() << endl;//返回 deque容器的大小deqT.resize(5); //输为1 2 3 4 5deqT.resize(10, 6);//输出为1 2 3 4 5 6 6 6 6 6}

vector容器的操作与deque几乎相同,但是在deque容器中没有容量这一概念,在vector容器中用capacity()函数获取

插入和删除

  • deque容器两端插入数据
    push_front();//首部插入数据
deque<int> deq;
deq.push_front(1);//deq容器中元素为:1

push_back();//尾部插入数

deq.push_back(2);//deq容器中元素为:1 2
  • deque容器中间插入数据
    insert(pos, elem);//向pos位置插入elem元素,现在和下面方法中所提到的pos都是迭代器位置
deq.insert(deq.begin(), 5);//deq容器中元素为:5 1 2

insert(pos, n, elem);//向pos位置插入n个elem元素

deq.insert(deq.end(), 4, 5);//deq容器中元素为: 5 1 2 5 5 5 5

insert(pos,begin,end);;//向pos位置插入[begin,end)区间元素

deque<int>deq1;
deq1.push_back(1);
deq1.push_back(2);
deq1.push_back(3);
deq.insert(deq.begin(), deq1.begin(), deq1.end());//deq容器中元素为: 5 1 2 5 5 5 5 1 2 3
  • deque容器两端删除数据
    pop_front();//删除首部数据
deq.pop_front();//deq容器中元素为:1 2 5 5 5 5 1 2 3

pop_back();//删除尾部数据

deq.pop_back();//deq容器中元素为:1 2 5 5 5 5 1 2
  • deque容器删除数据
    erase(pos);//删除pos位置的元素,返回下个数据的位置,pos用迭代器表示位置
deque<int>::iterator a = deq.erase(deq.begin());//deq容器中元素为2 5 5 5 5 1 2
cout << "a为:" << *a << endl;//a为2

erase(begin,end);//删除[begin,end)区间的元素,返回下个数据的位置

deque<int>::iterator b = deq.erase(++deq.begin(), --deq.end());//deq容器中元素为2 2cout << "b为:" << *b << endl;//b为2,这里的2是后面的元素

数据存取

deque<int>deq;
for (int i = 0; i < 10; i++)
{deq.push_back(i + 1);
}
  • at(pos);访问pos位置的元素,这里的pos是容器的下标,int型数据
 deq.at(0);//1
  • operator[];
deq[1];//2

-front();

deq.front();//1
  • back();
deq.back();//10

容器元素排序

sort(iterator begin, iterator end);//对[begin,end)区间的元素进行排序,begin和end表示的是迭代器
sort()方法是STL提供的排序方法,默认是升序排序,所有支持随机访问的容器都能使用sort()方法。

#include<algorithm>//使用sort()函数必须包含标准算法头文件
deque<int> deq
deq.push_back(2);
deq.push_back(5);
deq.push_back(8);
deq.push_front(3);
deq.push_front(6);
deq.push_front(1);
dequePrint(deq);//1 6 3 2 5 8
sort(deq.begin(),deq.end());
dequePrint(deq);//1 2 3 5 6 8
}

【STL容器讲解—deque】相关推荐

  1. c++STL容器的Deque

    STL容器的Deque Deque简介 deque对象的默认构造 deque末尾的添加移除操作 deque的数据存取 deque与迭代器 deque对象的带参数构造 deque的赋值 deque的大小 ...

  2. C++ 笔记(19)— 标准模板库(STL容器、STL迭代器、STL算法、STL容器特点、STL字符串类)

    C++ 标准库可以分为两部分: 标准函数库: 这个库是由通用的.独立的.不属于任何类的函数组成的.函数库继承自 C 语言. 面向对象类库: 这个库是类及其相关函数的集合. C++ 标准库包含了所有的 ...

  3. c++ STL容器初探

    什么是容器 首先,我们必须理解一下什么是容器,在C++ 中容器被定义为:在数据存储上,有一种对象类型,它可以持有其它对象或指向其它对像的指针,这种对象类型就叫做容器.很简单,容器就是保存其它对象的对象 ...

  4. C++拾趣——STL容器的插入、删除、遍历和查找操作性能对比(Windows VirtualStudio)——遍历和删除

    相关环境和说明在<C++拾趣--STL容器的插入.删除.遍历和查找操作性能对比(Windows VirtualStudio)--插入>已给出.本文将分析各个容器中遍历和查找的性能.(转载请 ...

  5. C++拾趣——STL容器的插入、删除、遍历和查找操作性能对比(Windows VirtualStudio)——删除

    相关环境和说明在<C++拾趣--STL容器的插入.删除.遍历和查找操作性能对比(Windows VirtualStudio)--插入>已给出.本文将分析从头部.中间和尾部对各个容器进行删除 ...

  6. C++拾趣——STL容器的插入、删除、遍历和查找操作性能对比(ubuntu g++)——遍历和查找

    相关环境和说明在<C++拾趣--STL容器的插入.删除.遍历和查找操作性能对比(ubuntu g++)--插入>已给出.本文将分析各个容器中遍历和查找的性能.(转载请指明出于breakso ...

  7. C++拾趣——STL容器的插入、删除、遍历和查找操作性能对比(ubuntu g++)——删除

    相关环境和说明在<C++拾趣--STL容器的插入.删除.遍历和查找操作性能对比(ubuntu g++)--插入>已给出.本文将分析从头部.中间和尾部对各个容器进行删除的性能.(转载请指明出 ...

  8. gdb 查看 stl容器 zz

    将下面文件作为 ~/.gdbinit的内容, 或者在已有的~/.gdbinit中source下面的文件, 然后可以以下列方式查看stl容器的数据:  容器类型 GDB 命令 std::vector&l ...

  9. 标准非STL容器 : bitset

    1. 概念 什么是"标准非STL容器"?标准非STL容器是指"可以认为它们是容器,但是他们并不满足STL容器的所有要求".前文提到的容器适配器stack.que ...

最新文章

  1. python 列出出当前目录及所有子目录下的文件
  2. Android关于SQLiteOpenHelper的封装
  3. python的底层实现,Python封装底层实现原理详解(通俗易懂)
  4. 建模算法(六)——神经网络模型
  5. 开源许可协议了解这些就够了
  6. elk服务重启_ELK开机启动 service文件内容
  7. 域名指向 旧域名跳转到新域名
  8. 商汤科技2020笔试题
  9. Pollard’s rho 算法解大数质因子问题
  10. 日记 [2007年04月19日]竹叶扫街尘不动,鏡花潭底水无痕
  11. 基于iLog3的实时日志实现
  12. 设置全局css/less/sass样式and优化与style-resources-loader的理解
  13. linux apache 404配置文件,apache httpd服务器404错误跳转配置教程
  14. dreamweaver排列顺序怎么用_Dreamweaver使用技巧
  15. 苹果手机(ipone)点击元素,事件不执行
  16. “新华三杯”全国大学生数字技术大赛预选赛备考资料
  17. 计算机事件查看u盘使用情况,关于U盘使用记录的日志文件
  18. Xcode 更改默认版本 xcode-select
  19. 【Google I/O 2017回顾】Mobile First To AI First
  20. 学习java的基础总结

热门文章

  1. 渗透过程中日志信息分析示例
  2. PHP程序设计读书笔记七
  3. linux deploy连接ssh失败,ubuntu – Jenkins发布ssh成功连接服务器但是put文件失败
  4. 我喜欢出发 - 汪国真
  5. 微信小程序开发-微信支付功能【WxMaService 获取openid,WxPayService建微信订单,接收微信支付异步通知回调方法,附有完整前后端代码】
  6. 制作一幅好地图的10个技巧
  7. 普通地图的六大要素_地图的构成要素和基本特性
  8. 各个音阶的频率_各个音的频率是如何确定的?
  9. BI神器Power Query(17)-- PQ制作时间维度表(6)
  10. linux中strlen的用法,实现strlen()函数,strcmp()函数 const知识点