深入研究 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模板编程

-
  • 1970年01月01日 08:00

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

  本文深入地研究了std::deque 容器。本文将讨论在一些情况下使用deque比vector更好。读完这篇文章后读者应该能够理解在容量增长的过程中deque 与vector在内存分配和性能的不同...
  • ark1111
  • ark1111
  • 2004-12-16 17:03:00
  • 1511

带你深入理解STL之Deque容器

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

关于C++ STL(标准模板库)的资料

  • 2009年05月15日 22:54
  • 422KB
  • 下载

C++ STL几个容器的底层实现

C++ STL 的实现: 1.vector      底层数据结构为数组 ,支持快速随机访问 2.list            底层数据结构为双向链表,支持快速增删 3...
  • g11d111
  • g11d111
  • 2017-09-23 10:51:17
  • 215

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

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

【C++】STL常用容器总结之五:双端队列deque

所谓的deque是”double ended queue”的缩写,双端队列不论在尾部或头部插入元素,都十分迅速。而在中间插入元素则会比较费时,因为必须移动中间其他的元素。双端队列是一种随机访问的数据类...
  • hero_myself
  • hero_myself
  • 2016-08-25 11:05:53
  • 2752

STL之deque容器的实现框架

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

c++自定义类内给stl容器类初始化的方法

以 valarray 容器类为例 运行环境为vs15一般而言想给valarray初始化大小可以这么做:valarray a(10)或者valarray a(10) = valarray(10)然而,在...
  • u010511984
  • u010511984
  • 2017-02-21 11:29:12
  • 306

deque及迭代器失效问题

deque由一段一段的定量连续空间构成,采用一个表(map)来记录每个连续空间的首址,map是一小块连续的空间,目的是便于迭代器的寻址(map+1即可跳转到下一个连续空间的首址)。map中的每一个元素...
  • ww32zz
  • ww32zz
  • 2015-09-05 15:18:04
  • 1459
收藏助手
不良信息举报
您举报文章:深入研究 C++中的 STL Deque 容器(三)
举报原因:
原因补充:

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