c++ - 如何自定义模板 AVL 树的不变量?
问题描述
我正在开发一个通用的 AVL 树,并希望默认使用 T 的 < 和 > 运算符,但也可以选择替换自定义的运算符,这样我就可以更好地控制不变量,并且无需将 T 放入我的盒子中。
我对 C++ 中的函数指针/对象不是很熟悉,我应该在哪里寻找?标准::绑定()?拉姆达斯?
template <typename T>
class avl_tree
{
private:
std::shared_ptr<avl_node<T>> root_ {nullptr};
// > function object? uses T's > by default
// < function object? uses T's < by default
public:
avl_tree() = default;
// avl_tree(?, ?) constructor accepting overloads
// for the < and > operators
};
解决方案
你应该模仿std::set
。将比较器作为模板参数:
template <typename T, class Compare = std::less<Key>>
class avl_tree
{
private:
Compare comp;
public:
avl_tree() = default;
avl_tree(Compare comp) : comp{comp} {}
}
并与
comp(a, b); // instead of (a < b)
comp(b, a); // instead of (b < a)
推荐阅读
- javascript - 不允许将顶部框架导航到数据 URL:data:image/png;base64,谷歌图表中的错误
- flutter - Flutter inkwell - 我如何只代理某些特定事件并传递其他事件?
- ruby-on-rails - RSpec:如何进行一个 shared_example 测试来测试许多不同的控制器 PATCH 请求,这些请求都更新不同的属性?
- php - 试图解密从 PHP 中的 U2 子例程发送的数据
- python - 使用 Python 从图像中提取对象
- javascript - react native - 根据选择的按钮数量更改道具状态
- python - 查找和替换数据框中的字符串
- node.js - Dialogflow Nodejs API中sessionId的用途是什么
- r - 在先验算法中分解或分类数据的问题
- laravel - Laravel 5.6 - 无法更改 $request 中上传的文件名,临时名称插入数据库