深入研究 C++中的 STL Deque 容器(三)

转载 2007年10月11日 16:59:00
 实验四—— vector::insert() 和 deque::insert() 执行特点比较

  目的

  deque主张使用参数为常量的insert()。但怎么样能和vector::insert()比较一下呢?本实验的目的就是比较一下vector::insert()> 和 deque::insert()的工作特点。

  描述

  在容器的容器多次插入数据,在这里可能不符合你的需求,既然这样你可以使用insert(),试验代码也和实验一基本一样,使用insert()代替push_back(),使用insert(>)来测试。

  结果

  当插入常量给deque的时候,从下图可以看出和vector的对比来。


  注意两张图片中时间轴的不同,这是将>61810个数据插入到容器中。


  实验五——读取容器的性能

  目的

  这个实验将测试vector::at(),vector::operator[],deque::at()和deque::operator[]的性能。首先应该是operator[]比at()效率要高,因为它不进行边界检查,同时也比较vector和deque。

  描述

  这个实验将测试中的容器有1000000个类型为std::string,每个字符串长度为1024的数据,分别使用at()和operator[]这两个操作来访问容器容器的数据,测试它们运行的时间,这个测试执行50次,统计每次执行的结果。

  结果

  我们看到使用vector和deque访问容器中的数据,他们执行的性能差别很小,使用operator[]和at()访问数据的性能差别几乎可以忽略不计,下面是统计的结果:


vector::at()

Mean

1.177088125sec

Maximum

1.189580000sec

Minimum

1.168340000sec

Std. Dev

0.006495193sec

6-Sigma

0.038971158sec

deque::at()

Mean

1.182364375sec

Maximum

1.226860000sec

Minimum

1.161270000sec

Std. Dev

0.016362148sec

6-Sigma

0.098172888sec

vector::operator[]

Mean

1.164221042sec

Maximum

1.192550000sec

Minimum

1.155690000sec

Std. Dev

0.007698520sec

6-Sigma

0.046191120sec

deque::operator[]

Mean

1.181507292sec

Maximum

1.218540000 sec

Minimum

1.162710000sec

Std. Dev

0.010275712sec

6-Sigma

0.061654272sec

  结论

  在这篇文章中我们覆盖了多种不同的情况来选择我们到底是该使用vector还是deque。让我们总结一下测试的结果看下面几个结论。

  当执行大数据量的调用push_back()的时候,记住要调用vector::reserve()。

   在实验一中我们研究了vector和deque在插入数据的情况。通过这些假设,我们可以看出deque分配的空间是预先分配好的,deque维持一个 固定增长率,在vector实验中我们考虑到应该调用vecor::reserve()>.然后在下面这个例子验证了我们的假设,在使用 vector的时候调用reserve()能够膀子我们预先分配空间,这将是vector一个默认选择的操作。

  当你分配很多内存单元的时候,记住使用deque回收内存要比vector消耗时间多。

   在实验三中我们探讨了vector和deque在回收非邻接内存块上的不同,分别证明了vector在分配内存的时候是线性增长,而deque是指数增 长,同样,vector要回收的内存比deque多的多,如果你循环调用了push_back(),那么deque将获取大量的内存,而且是临近的。我们 通过测试发现在分配内存单元消耗的时间和vector的时间接近。

  如果你计划使用insert(),或者需要pop_front(),那就使用deque。

  由于vector没有提供pop_front()函数,但在实验四的结果中可以看出没有insert()是非常好的,同时也告诉我们为什么deque在STL类中要作为单独的一个类划分出来。

  对于访问数据,vector::at()效率最高。

  在实验五中统计的数据表示,所有访问数据方法的效率是非常接近的,但是vector::at()效率最高。这是因为最优的平衡图访问时间为最低的六个西格玛值。

  最后

  我希望本文能够带你认识deque,而且对它感兴趣或者一个启发,欢迎继续讨论关于vector和deque任何问题和内容。

stl之deque双端队列容器

deque与vector非常相似,不仅可以在尾部插入和删除元素,还可以在头部插入和删除。不过当考虑到容器元素的内存分配策略和操作性能时,deque相对vector较为有优势。 头文件 #include...
  • u010418035
  • u010418035
  • 2015年07月03日 09:53
  • 2067

STL之deque容器的实现框架

vector底层采用的是一个数组来实现,list底层采用的是一个环形的双向链表实现,而deque则采用的是两者相结合,所谓结合,并不是两种数据结构的结合,而是某些性能上的结合。我们知道,vector支...
  • JXH_123
  • JXH_123
  • 2014年06月24日 20:28
  • 1272

STL源码剖析——deque的实现原理和使用方法详解

Deque 简介     deque是“double—ended queue”的缩写,和vector一样都是STL的容器,deque 是双端数组,而 vector 是单端的。     deque 在接...
  • baidu_28312631
  • baidu_28312631
  • 2015年08月26日 10:48
  • 3834

深入研究 C++中的 STL Deque 容器

本文档深入分析了std::deque,并提供了一个指导思想:当考虑到内存分配和执行性能的时候,使用std::deque要比std::vector好。   介绍   本文深入地研究了std:...
  • caojunhao123
  • caojunhao123
  • 2013年08月27日 09:32
  • 619

深入研究 C++中的 STL Deque 容器

本文档深入分析了std::deque,并提供了一个指导思想:当考虑到内存分配和执行性能的时候,使用std::deque要比std::vector好。   介绍   本文深入地研究了std:...
  • Plutus_Lee
  • Plutus_Lee
  • 2013年01月25日 13:26
  • 858

stl容器区别(内存布局和使用场合): vector list deque set map

set 和map都是无序的保存元素,只能通过它提供的接口对里面的元素进行访问。  set:集合, 用来判断某一个元素是不是在一个组里面,使用的比较少  map:映射,相当于字典,把一个值映射成另一个值...
  • u012223913
  • u012223913
  • 2016年04月22日 22:27
  • 1223

C++ STL 迭代器失效

c++ STL迭代器失效总结
  • zxx910509
  • zxx910509
  • 2015年12月18日 09:43
  • 427

带你深入理解STL之Deque容器

在介绍STL的deque的容器之前,我们先来总结一下vector和list的优缺点。vector在内存中是分配一段连续的内存空间进行存储,其迭代器采用原生指针即可,因此其支持随机访问和存储,支持下标操...
  • terence1212
  • terence1212
  • 2016年08月26日 11:43
  • 3486

基于环形缓冲区的deque实现方法

众所周知,C++ STL中有一个叫做deque的容器,实现的是双端队列数据结构,这种队列允许同时从队列的首部和尾部插入和删除数据。 然而在STL中这种数据结构是用”分段连续”的物理结构实现的(可以参...
  • vipally
  • vipally
  • 2016年10月20日 00:50
  • 566

C++ STL容器时间复杂度下的最佳选择

STL在C++11中还算是火热,想必大家早有耳闻,对于泛型编程而言,或者数据结构而言,STL都显得尤为重要。今天让我们来了解一下,根据时间复杂度这个条件,挑选最适合自己程序的STL。...
  • CSND_Ayo
  • CSND_Ayo
  • 2017年06月21日 16:24
  • 1270
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深入研究 C++中的 STL Deque 容器(三)
举报原因:
原因补充:

(最多只允许输入30个字)