c++实现数据结构的细节问题

来源:互联网 发布:网络禁书 编辑:程序博客网 时间:2024/05/22 17:45

              看Allen Weiss的"数据结构与算法分析:c++描述",也想动手实现书中工巧的模板数据结构.真正动起手来发现很多需要留心注意的地方.

模板类最省事最简单的方法是整个类完全定义在一个头文件中,并且成员函数的定义放在类体中.如果用c++ primer中include cpp文件的方法就会报错.可能现在的编译器不大支持包含编译的方式了.

可以在类的内部定义嵌套类.嵌套类可以在外部类的public标号下也可以在外部类的private标号下.如果不希望用户使用就标记为private,比如List中的Node类;如果希望用户使用就标记为public,比如List中的iterator和const_iterator类,他们用OuterClass<type>::InnerClass方式引用.

最让人困扰的是const的使用.一个成员函数声明可以包含三个const:const返回值,const形参,const函数.下面我说一下遇到的问题和思考.

List类含有一个clear方法,它循环调用pop_back()成员清空链表.如果定义clear的const版本,pop_back()函数也要有const版本.然而--const对象不应该定义pop_back()函数.这样一来const对象不就没办法释放空间了吗(List类的析构函数调用clear方法).一个可行的方法是,定义两个clear方法, 同时定义两个pop_back()方法. 其中const版本的pop_back()方法标记为private,这样一来用户就无法在const对象上调用pop_back()函数了.仍然不明白的是,为什么只定义const版本的clear方法不行.非const对象也可以调用const版本的方法呀?

形参为指针或引用的时候,大多数情况下应该让他成为const的.基本不存在不适用的情况.

const_iterator的自增操作符和自减操作符能定义为const版本吗?不能.++和--本身就有改变操作数的语义,在对象身上重定义时仍旧适用.所以const对象是不能使用++和--的.

二叉搜索树的实现方式值得思考.BinarySearchTree类包含一系列无参函数:findMax(),findMin(),insert(),remove(),contains()等.这里的无参只的是没有指向树节点的指针这样的参数.如果硬生生在这类给目标用户使用的函数中实现,就只能用非递归方式了.原因在于递归方式需要不断传递指向树节点的指针.然而,树的定义到很多性质都是递归的,所以这类函数的最简单实现还是递归.Weiss给出的解决方法是,在类中定义一系列与上面函数对应的private含参函数,具体的递归使用这些含参函数.这样一来,用户看到的是和树结构无关的函数接口--不需要传递一个根节点(况且Node类是private嵌套类,我们很清楚这个类不需要用户知晓),实现者也能看到很清晰的设计结构.这种设计方式是简洁优雅的.

BinarySearchTree类还有值得记下来的技巧.insert()方法插入一个节点.这个面向对象的方法有一个含参版本,它的形参是树节点指针.现在一个新的问题浮出水面了:在找到要插入的位置时,传递的指针已经是NULL了.怎么把新节点链接到树中呢?一种方法是往前看一步,如果是NULL就就地链接.可是这种方法可能导致特殊情况的出现.Weiss提出的解决方法是,传递指针引用.指针引用不稀奇,让人感觉诧异的是NULL指针的引用也有效.不管怎样,使用指针引用很好地解决了这个问题.



0 0
原创粉丝点击