C 通用树按两个标准进行比较
C++ Generic Tree Comparing by Two Criteria
我开始在通用树上工作,而我是C 的新手。我希望能够形成两个相同元素的树,但是在每棵树中以不同的方式进行比较。从我可以看出我是否超载<然后,我只能定义一个功能。我以为我也许可以将指针转到功能,但我觉得这是错误的方法。
template<class T, int (*Comp)(T*, T*)> class Tree
尝试这样做的建议是什么?谢谢
no,您做不是想要指定指向函数的指针(这样做将禁止使用函数对象,这通常是可取的(。
模板参数通常应为类型参数 - 在这种情况下,您几乎肯定要提供std::less<T>
的默认值,因此看起来像这样:
template <class T, class Comp = std::less<T>>
class Tree {
// Implementation here.
};
this will 允许对函数指针进行实例化,但是(如上所述(也将支持函数对象。
注意,但是,模板参数仅指定您用于进行比较的事物的类型。在典型的情况下,您需要该类型的实例才能做某事。构造对象时,通常会指定此内容,因此您将拥有类似的东西:
template <class T, class Comp = std::less<T>>
class Tree {
public:
Tree(Comp c = Comp()) : c(c) {}
bool insert(T value) {
if (c(value, root->value)) // if value < root->value
// ...
else if (c(root->value, value)) // if root->value < value
}
private:
struct Node {
T key;
Node *left , *right;
} *root;
Comp c;
};
因此,模板参数为进行比较的事物指定类型。我们给它一个std::less<T>
的默认值;这将适用于内置类型,以及使a<b
成为合法表达的其他任何事物(假设我们希望可以进行比较(。如果我们提供其他类型,则必须使用它来确保它定义严格的弱点。
然后,我们将比较类型的实例传递给构造函数。同样,我们指定该类型的默认构造实例的默认值。对于函数对象类型(例如std::less<T>
或std::greater<T>
(的常见情况,默认的构造对象将做正确的事,因此我们需要的一切。
对于不太常见的情况,想要使用指针指向函数,我们必须将正确的类型指定为模板参数,和,我们必须将指针传递给正确的功能构造函数。
相关文章:
- 两个标准::unordered_map的交集
- 是否有一种标准方法来计算两个 asctime() 值之间的天数
- 关于标准::condition_variables的两个问题
- 标准::原子::compare_exchange与两个memory_order参数一起使用的真实示例
- 两个标准::数组的交叉部分
- C 是否具有对两个STD :: sets,vectors等进行三角比较的标准方法
- C 通用树按两个标准进行比较
- NTRUEncrypt:使用开源标准算法中的描述无法正确找到两个多项式的GCD,无法定义是否存在多边形的逆
- 是否存在用于按以下方式对两个范围进行排序和分区的标准算法?
- 两个Eigen::VectorXd的有效(非标准)连接
- 如何在c++中使用两个排序标准(对于一组对)创建有序集
- ios_base::sync_with_stdio(false) 在来自标准输入的两个输入之间不起作用
- 如何比较两个比较两个标准::设置
- 在标准(C++14)中,哪里说以下两个声明是等价的
- 是否有使用谓词比较两个范围的标准方法
- 两个标准::列表之间的距离
- 两个模板函数用于两种标准类型
- 如何到达标准中的元素::在C++中设置两个乘二
- c++标准是否允许添加两个整数(基本类型int)来抛出c++异常?
- 连接两个标准::向量