y****i 发帖数: 23 | 1 假设要写一个通用类型的binary search tree
class的定义大致是这样子的
template
class BST{
private:
T key;
T * left;
T * right;
public:
insert...
delete...
}
问题是,在写插入算法的时候牵涉到数据的比较,但是T啥类型我们又不知道,有可能
int,也有可能是struct,怎么比较两个T类型的变量呢? | t****t 发帖数: 6806 | 2 参考STL的做法.
STL的做法是在模板参数里提供一个compare类型, 有缺省值, 比如map
template , ...>
class map { ... };
less::operator()(T, T)对于大多数类型, 就是operator<.
对于struct S, 你可以提供
bool operator<(const S&, const S&)
或者你不想要<, 你想要>, 可以写map >
【在 y****i 的大作中提到】 : 假设要写一个通用类型的binary search tree : class的定义大致是这样子的 : template : class BST{ : private: : T key; : T * left; : T * right; : public: : insert...
| y****i 发帖数: 23 | 3 哦,想通了,多谢。:)
也可以把T的operator<需要的时候overload一下,是么?
【在 t****t 的大作中提到】 : 参考STL的做法. : STL的做法是在模板参数里提供一个compare类型, 有缺省值, 比如map : template , ...> : class map { ... }; : less::operator()(T, T)对于大多数类型, 就是operator<. : 对于struct S, 你可以提供 : bool operator<(const S&, const S&) : 或者你不想要<, 你想要>, 可以写map >
| t****t 发帖数: 6806 | 4 overload不对.
less期望的operator<的原型就应该是
bool operator<(const T&, const T&)
或者
bool operator<(T, T)
要overload的话原型必须不同, 但是原型不同就没法调用了
【在 y****i 的大作中提到】 : 哦,想通了,多谢。:) : 也可以把T的operator<需要的时候overload一下,是么?
| l**a 发帖数: 43 | 5 我觉得LZ是说如果T本来没有定义operator<的话,可以参照bool operator<(const T&,
const T&)写一个
【在 t****t 的大作中提到】 : overload不对. : less期望的operator<的原型就应该是 : bool operator<(const T&, const T&) : 或者 : bool operator<(T, T) : 要overload的话原型必须不同, 但是原型不同就没法调用了
| y****i 发帖数: 23 | 6 我明白你的意思啦,多谢。
从你的建议的提示,我想到可以这么做
template
class BST{
.....
}
在T的定义里面overload <,>,=这些需要用到的operator
这样在class BST里面就可以直接比较两个T类型的变量
【在 t****t 的大作中提到】 : overload不对. : less期望的operator<的原型就应该是 : bool operator<(const T&, const T&) : 或者 : bool operator<(T, T) : 要overload的话原型必须不同, 但是原型不同就没法调用了
| y****i 发帖数: 23 | 7 嗯,我是这个意思。:)
&,
【在 l**a 的大作中提到】 : 我觉得LZ是说如果T本来没有定义operator<的话,可以参照bool operator<(const T&, : const T&)写一个
|
|