介绍一本书

   William Ford和William Topp写过一本《数据结构C++语言描述—应用标准模板库(STL)》的书,这本书加深了我对C++的理解。

    我最开始学C++,看的是谭浩强写的C++程序设计。这本书对初学者是本好书,例子好懂。

    后来开始读《数据结构...(STL)》这本书时,觉得自己知识不够,就只有翻有C++百科全书之称的C++Primer,才能一点点地看,不懂的就跳过,觉得有感觉以后再读前面跳过的地方。

    这本书的另一个好就是源代码可以运行(记得有一个画图形的程序不行,可能是我软件没有这个库),还有不同版本,有DEV和VS-C++。严蔚敏的数据结构(C语言版)用的是C语言伪代码,记得当初初学时很傻地照着书把代码一字不差地打下来,最后没法运行,实在是很挫折。

    另外,很多细节书上也讲了。比如父类的析构函数不是虚函数的话,那么子类就不会执行自己的析构函数,这就很危险;计算阿伏加德罗常数,最好用迭代法。如果单纯用递归,时间复杂度将平方增长。不过如果用有中间量做储存,避免重复运算,那么时间复杂度还是线性的,但多花了空间。

    书中的一个例子是求素数(示范<set>容器的用法),大素数对开现代的非对称密码学非常重要。这个例子是用筛法求素数,不过我先前用python用试除法写的求质数程序和这个程序的效率居然差不多。第一,C++比java快三到四倍,java又比python快;第二,筛法在理论上的速度应该比试除法快(外循环少,内循环多)。后来我用C++写试除法,就比筛法还快。后来我又看了那个写怎么求素数方法好的博客,上面说频繁地对一个大的容器进行删除操作可能会导致频繁的内存分配和释放,效率会很低,使用布尔型容器来存储素数较好,结果一试,执行速度快了很多。

    但我觉得仍然不够,就把用索引循环改成了用迭代器循环,速度又快了一些,因为用索引循环要计算索引所在的位置,在数据容器很大的情况下,迭代器比索引快。

    书上的筛法例子是去除去N的开方以下所有自然数的倍数,实际上除去N的开方以下所有质数的倍数就行。为了方便,我就用我先前写试除法得到开方以下的质数列表,如果用筛法,布尔型容器还要转换。偷了一下懒。

    后来想用那个博客说的按位(bit)存储的思路,开始想用Bitset,结果发现不能用变量作参数,只能直接用数字作参数,虽然能用数组,但不能用向量。后来使用了这本书源码中的bitVector类。改进后,速度快很多,也可能是因为是位运算速度快,或是所需空间的减少,减少了计算空间位置的运算。后来我自己又照着bitVector类和C++Primer,根据实际需要,写了个简单的bitset类(实际上还是用无符号char向量,但算法有些不一样),速度又快了一点,在我电脑上算两百万个素数用了约9秒多(不cout的情况),比用bitVector类还快了1秒。


    (以上总结是我写出求素数程序较久以后写的,回忆不可能完全正确)。

    从上面也理清了一个思路,在什么样的情况下用什么容器。仅仅是需要做判断,如求质数,用(bit)存储好;书上说多数情况下用vector:比如数据不长,或是虽然数据很长,只需要对头尾进行插入删除操作,并顺序读取数据;方便地查找和排序用<set>;用表驱动法,应该就要用字典。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值