Download - 面向对象的程序设计 第三讲 <续>模板编程
面向对象的程序设计面向对象的程序设计第三讲 <续>模板编程第三讲 <续>模板编程
华中科技大学华中科技大学 CADCAD 中心中心吴义忠(吴义忠( 6292091562920915 ))[email protected]@hustcad.com
回顾回顾 STLSTL 容器类:容器类: vector<int>vector<int> StackStack 的改进的改进class Stack {class Stack {public: public:
bool push( const string& );bool push( const string& ); bool pop( string &elem );bool pop( string &elem );
bool peek( string &elem );bool peek( string &elem );
bool empty();bool empty();bool full();bool full();
// definition of size() is placed within // definition of size() is placed within classclass
// other members are simply // other members are simply declared ...declared ...int size() { return _stack.size(); }int size() { return _stack.size(); }
private:private:vector<string> _stack;vector<string> _stack;
};};
template <typename template <typename valTypevalType>>class Stack {class Stack {public: public:
bool push( const bool push( const valTypevalType& );& );
bool pop( bool pop( valTypevalType &elem ); &elem );bool peek( bool peek( valTypevalType &elem ); &elem );
bool empty();bool empty();bool full();bool full();
int size() { return int size() { return _stack.size(); }_stack.size(); }
private:private:vector<vector<valTypevalType> _stack;> _stack;
};};
模板定义的关键字模板定义的关键字 模板的定义 模板的定义 < X x1 >< X x1 > ,, XX 可以为:可以为:
typename typename 传入类型名传入类型名 class class 传入类名传入类名 template< > template< > 模板嵌套模板嵌套 intint 等具体类型,传入具体数等具体类型,传入具体数 函数指针类型,传入函数指针函数指针类型,传入函数指针
本章设计任务:二叉树操作本章设计任务:二叉树操作Binary treeBinary tree 每个节点最多只有一个父每个节点最多只有一个父节点,最多只有两个子节节点,最多只有两个子节点点 只有一个根节点只有一个根节点 二叉树操作:遍历(前序、二叉树操作:遍历(前序、中序、后序)、插入、删中序、后序)、插入、删除、查找等除、查找等
6.1 6.1 参数化的节点数据类型参数化的节点数据类型 BTnodeBTnode (节点类,(节点类,负责存储数据和连接负责存储数据和连接指针)类设计指针)类设计 BineryTree(BineryTree( 存储根存储根节点,封装二叉树的节点,封装二叉树的各种操作各种操作 )) 类类
6.2 6.2 类模板定义类模板定义
成员函数的定义成员函数的定义 构造函数构造函数 一般成员函数一般成员函数
6.3 6.3 类型参数的处理类型参数的处理效率考虑效率考虑 尽量使用尽量使用 const const referencereference 尽量避免二次赋值:尽量避免二次赋值:构造之前,执行成员数据构造构造之前,执行成员数据构造
:_val()
6.4 6.4 二叉树类模板的实现二叉树类模板的实现 插入新元素,规则:保插入新元素,规则:保持左小右大持左小右大算法:算法:11 )如果等于节点值则其重)如果等于节点值则其重复数加复数加 11 ;;22 )如果插入值小于节点值,)如果插入值小于节点值,则插入其左节点(若空,则插入其左节点(若空,则新建,否则递归);则新建,否则递归);33 )否则插入其右节点)否则插入其右节点
删除操作:保持原有排序特性删除操作:保持原有排序特性 算法介绍:算法介绍:11 )根节点删除)根节点删除22 )一般节点删除)一般节点删除33 ))使一个节点成使一个节点成为子树的最左叶为子树的最左叶子节点子节点
static
删除根节点删除根节点
多余!
删除一般节点删除一般节点
改进方法:去除 &, 传入 this 指针加一句:BTnode *tmp = prev;和If (tmp->_val > val)
tmp->-_rchild = prev;Else tmp->_lchild =
prev;
删除整个二叉树删除整个二叉树
二叉树遍历二叉树遍历
6.5 6.5 函数模板实现函数模板实现 outputoutput 运算运算符符template <typename elemType>ostream& BinaryTree<elemType>::print( ostream &os, void (BinaryTree::*traversal)( ostream& ) const ) const{
(this->*traversal)( os );return os;
}
template <typename valType>void BTnode<valType>::inorder( BTnode *pt, ostream &os ) const{ if ( pt )
{ if ( pt->_lchild ) inorder( pt->_lchild,
os );display_val( pt, os );if ( pt->_rchild ) inorder( pt-
>_rchild, os );}
}
template <typename valType>inline void BTnode<valType>::display_val( BTnode *pt, ostream &os ) const{ os << pt->_val; if ( pt->_cnt > 1 ) os << "( " << pt->_cnt << " ) "; else os << ' ';}
6.6 6.6 非类型参数模板:常量表达式非类型参数模板:常量表达式和默认参数和默认参数
num_sequencenum_sequence 重写重写
函数地址作为参数函数地址作为参数
6.7 6.7 模板参数化设计策略模板参数化设计策略 LessThan()LessThan() 函数对象函数对象模板模板 潜在问题潜在问题 如果如果 elemTypeelemType 类型类型未提供 未提供 < < 运算符,编运算符,编译出错!译出错!
LessThanLessThan 改进改进
ltpi(1200); //return falselpts(“Boy”); //return true;
6.8 6.8 模板成员函数模板成员函数 优点:优点: 不用多个重载函不用多个重载函数或多个类,完成数或多个类,完成不同类型数据的处不同类型数据的处理理
类模板中也可以使用类模板中也可以使用 member member template function template function
作业作业 pp134pp134 练习练习 4.54.5 pp89pp89 练习练习 6.26.2