再问: STL deque 问题.

xwu 2001-10-04 10:15:50
我的项目中要大量使用 STL 的 deque 来模拟硬件里的 pipeline. 一般来说, 就是先进先出, 但有时也要能随机访问.

我没什么STL 经验. 从网上得知 deque 很慢. 尤其是VC6 的deque. 下面是 : Solstice(胖胖) 的测试数据:

Borland C++ Complier 5.5.1
C version : 0.3242
C++ using list : 5.595
C++ using deque : 5.563

Visual C++ 6.0 with Service Pack 5
C version : 0.3945
C++ using list : 1.889
C++ using deque : 137.x (两分多钟,太奇怪了)

GNU C++ 2.95.3 with Cygwin1.dll 1.3.2
C version : 0.3300
C++ using list : 1.700
C++ using deque : 2.582

还有我从网上找到的Jeff Templon 的数据:

Version 250 MHz R10000 400 MHz PII Source Lines
------- -------------- ----------- ------------
C 0.36 sec 0.30 sec 150
Java 4.9 9.2 105
C++/STL/deque 2.6 11.2 70
C++/STL/list 1.7 1.5 70
Awk 2.2 2.1 20
Perl 1.8 1.0 18

值得注意的是他们用的都是Kernighan and Pike 书上的例子.

由于STL deque 的功能对于我的项目非常合适, 我很想用. 但如果他的效率真的这么慢那就不得不放弃了.

大家有什么好的建议吗?
...全文
193 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
xwu 2001-10-06
  • 打赏
  • 举报
回复
帮助很大, 多谢各位.
qqchen79 2001-10-05
  • 打赏
  • 举报
回复
VC6 的<iostream> 和 SGI STL 不兼容?
不会呀! 我现在就是用stlport的STL,VC的<iostream>,没有问题。
好像有个宏需要定义,然后就不用SGI STL的<iostream>了,可以在stlport上查查。
我觉得最简单的还是换SGI STL的deque。

另外,list不行,倒不是new和delete的问题(deque也要new/delete?)
list不能随机访问呀!
事实上,如果队列的长度固定,自己写一个queue也不是很难(有100行代码么?)
STL主要是在比较动态的环境下可以很大程度上减轻你的编程负担,但你也总不至于一个静态数组都用vector替代了吧?
xwu 2001-10-05
  • 打赏
  • 举报
回复
to hwang(送我分吧,穷死了).好主义.
但有个问题要弄清楚: list 在 push 和 pop 的时候, 会不会调用 new 和 delete? 如果是, 那就会很慢.

Only_I 2001-10-05
  • 打赏
  • 举报
回复
up
hwang 2001-10-05
  • 打赏
  • 举报
回复
可以用一个新类包容list容器,将其对外属性转换为deque的语义,应该可以。
hwang 2001-10-05
  • 打赏
  • 举报
回复
ms的deque有问题,已有定论,请看《stl之父访谈录》,本站就有。
qqchen79 2001-10-05
  • 打赏
  • 举报
回复
我用的是STLport,可以与VC6的<iostream>混合使用,没问题。
xwu 2001-10-05
  • 打赏
  • 举报
回复
谢谢Solstice(胖胖).
但工程要求我只能用 <iostream>. VC6 的<iostream> 和 SGI STL 不兼容.
陈硕 2001-10-05
  • 打赏
  • 举报
回复
你可以用SGI STL来代替vc6原带的STL,速度快,行得通!
xwu 2001-10-05
  • 打赏
  • 举报
回复
up
陈硕 2001-10-05
  • 打赏
  • 举报
回复
我的经验是"原始的"SGI STL与VC6搭配需要<iostream> => <iostream.h>
但使用STLport将会如何,我没有测试,值得你一试。
myan 2001-10-05
  • 打赏
  • 举报
回复
你需要的这个容器确实比较特殊,实际上是一个可以随机访问的queue。完全符合deque的用途。建议你就用deque。如果你自己来实现一个,建议用环形队列。

我认为通过自己地设计,减少不必要的对象拷贝,可以提高deque的效率。但是对于VC中的deque,到底效果如何,我没有把握。
xwu 2001-10-05
  • 打赏
  • 举报
回复
TO:qqchen79(知秋一叶) 
根据Solstice(胖胖) 的经验, SGI STL 要和 VC6 的<iostream.h> 用.
还有, 书上说, deque 的存储使用数组, 和 vector 类似, 一次分配足够的空间后, 不用再调 new 和 delete.

如果没有别的建议,看来只能自己写一个了. 虽不难, 但我很懒.....
xwu 2001-10-04
  • 打赏
  • 举报
回复
还有, 如果管到满了就不能在往里送数据包了.
xwu 2001-10-04
  • 打赏
  • 举报
回复
要求是:
实现一个最大容量却定的先进先出队列, 会有大量的push_back 和 pop_front. 偶尔会有用到 pop_back. 而且要求能比较方便的访问队列当中的某一个对象.

举个例子:
一个通讯管道. 发送方不断往管道一头里送数据包, 接收方从另一头取. 有时发送方会把刚送到管道里的数据包在取回来扔掉(发错了). 偶尔管道控制器会让管道中间排队的某个数据包加塞儿, 把它挪到前面(随机访问).
myan 2001-10-04
  • 打赏
  • 举报
回复
把你的要求说一说,看看我们能否帮你避开deque。

69,364

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧