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指针的引用也有效.不管怎样,使用指针引用很好地解决了这个问题.
- c++实现数据结构的细节问题
- 数据结构的实现细节
- c的一些细节问题
- C语言的细节问题
- c-c+ 全局变量的一些细节问题
- 迷宫问题的通用解法C语言数据结构实现
- C语言中变参函数的实现细节
- 【数据结构】c++Map的简单应用&& getline()细节
- C语言细节问题
- C语言数据结构中链队列细节
- C/C++中关于递归的实现细节的总结
- C语言 指针要注意的一些细节问题
- C和C++中sizeof的细节问题
- C++中const的实现细节(C、C#同理)
- 3、C函数可变参数实现细节的一些思考
- 关于C函数memcpy的实现细节思考
- C++中const的实现细节介绍(C,C#同理)
- [C#]问号的细节
- PHP操作MongoDB打模块 linux下,详细截图介绍(七)
- java中静态(static)运用(整理)
- UI控件是不能被addChild的
- 黑马程序员——iOS开发——oc——founctation中常用结构体(NSRange、NSPoint\CGPoint、NSSize\CGSize、NSRect\CGRect)
- Netty5源码分析(二) -- 线程模型分析
- c++实现数据结构的细节问题
- JAVA 看电视
- 关于整数的质因子分解和筛素数的分析
- KMP算法
- 在Oracle 9i/10g中使用Flashback
- 嵌入式 pppd中文man页面
- poj 3254 状态压缩dp
- 共模(Common Mode)差模(Differential Mode)共模抑制(Common Mode Rejection)
- 翻译一篇外文 关于优化linux系统启动时间的文章