Documentation
文档
Overview
《数据结构:思想与实现(第2版)》(翁惠玉,俞勇) 第6章 树
文件结构
注意:本章所有文件的编码都是UTF-8
./include
: 头文件./src
: 测试例程./doc
:HTML
和LATEX
文档HTML
文档打开方式:
cd ./path/to/projectRoot ./doc/html/index.html
Compiling
将./include
文件夹加入IncludePath
,编译./src
文件夹中的单个源文件。
- 例1
g++
编译并运行test0.cc
cd ./DS_Ch6
mkdir bin
g++ ./src/test0.cc -o ./bin/test0.exe -g -Wall -Wextra -Wshadow -static-libgcc -fexec-charset=GBK -std=c++17 -I ./include
./bin/test0.exe
- 例2 编译并执行所有测试
cd ./DS_Ch6
run_test.bat
References and notes
- 从绝对路径解析文件所在目录:
find_last_of
,用于test0.cc
- 用
C/C++
调用DOS
命令删除文件,用于test0.hh
- Returns the processor time consumed by the program:
clock
,用于test0.hh
- 获取当前时间:
localtime
,用于test0.hh
- 用堆栈消除递归的一般方法,用于
binaryTree.hh
- 不要类内初始化
struct
的成员!否则无法使用列表初始化,除非定义构造函数。用于binaryTree.hh
(braced-initializer-list)。 - 多加括号以避免优先级问题。例如优先级
&&
>||
,在g++编译选项开启-Wextra
时,可能出现warning: suggest parentheses around '&&' within '||'
。详见gcc官方文档:-Wparentheses
- 二叉树遍历的非递归实现是用堆栈消除递归的一般方法的简化情况。教材给出的方法可视作一般方法的简单情况,于是此方法统一了教材给出的递归消除方案。用于
binaryTree.hh
- 连续递归调用,可归为一个stage,按反序一次性进栈。
- 有限次连续tail recursions不必分stage,直接按反序进栈即可
- 类的非静态数据成员不能作成员函数的默认实参:原因。
- 函数模板的特定实例作类模板的特定实例的友元:类模板内的友元声明是否可省略模板实参?binaryTree.hh
- 结论:可以。类模板定义内,类模板名引用处的模板实参默认同类定义使用的模板实参。例如:
friend bool operator==</*T, Comparator*/>(const binaryTree /*<T, Comparator>*/ &lhs, const binaryTree /*<T, Comparator>*/ &rhs); friend void printBinaryTree</*T, Comparator*/>(const binaryTree /*<T, Comparator>*/ &bin_tree, const typename binaryTree /*<T, Comparator>*/ ::value_type &flag, std::ostream &out);
- 类的拷贝/移动构造/赋值运算符重载函数
- 参考1:C++风格指南——可拷贝类型和可移动类型
- 参考2:C++设计模式——原型模式
- 关于类的前向声明 核心是从编译器的角度思考:顺序编译到此条语句时,是否有足够的信息完成编译? 参考资料:
std::move()
的后果:实参变右值,语句执行完毕后被析构,变成过期对象。- 关于两种构造和两种赋值的简单测试:被移动的二叉树变成空二叉树,这正是析构函数定义的行为。过期对象仍可访问,还可被移动赋值。疑问:析构函数是否会释放自动成员?例
BinNode *root_
- 关于两种构造和两种赋值的简单测试:被移动的二叉树变成空二叉树,这正是析构函数定义的行为。过期对象仍可访问,还可被移动赋值。疑问:析构函数是否会释放自动成员?例
Homework
- 第六章作业:
- 简答题1~10,12
- 程序设计题1~6,7~9可以用伪码或者文字表示,鼓励正式代码,课下自行思考13~15。
Contact me
- Author: Guorui Wei (危 国锐)
- E-mail: 313017602@qq.com