【发布时间】:2022-08-02 23:22:36
【问题描述】:
在其他相关的 c++ 工作中,我设法创建了一种二叉搜索树模板。这里的含义是,使用这个模板,我可以为各种数据类型创建一个 BST……Int、string 等等。我被要求使用 BST 作为数据结构。让我们想象一下它的天气数据。测量设备每天记录几次温度,所以我有日期和时间以及温度。每条记录我想使用一个结构作为容器,所以我想要这样的东西:
struct Record
{
string DateTime;
float temperature;
};
DateTime 在这里是一个字符串,因为它的格式类似于 dd/mm/yyyy xx:xx。也许我可以将其转换为 int。
有数千条记录,我想将它们全部插入我的 BST。这是行不通的,我的 BST 模板不知道如何比较 2 条记录来判断哪一条将进入左链接和右链接。我可以只写一个布尔运算符 > 函数,它将接受 2 条记录,比较两者的日期时间,然后说稍后制作的记录是否“大于”早先制作的记录,因此它会进入树中,依此类推?这一般会起作用吗?
我是否应该做一些事情,比如创建一个名为 DateTime 的 int 与记录配对的地图,然后将代表 DateTimes 的所有整数值插入到我的 BST 中。然后当我需要取回我的数据时,首先我搜索 BST 以检查是否有条目,然后将结果用于我的地图,然后它应该给我我想要的对象。
我需要做这一切的原因是因为我想执行诸如“给我 2018 年每个月的平均温度”之类的计算。然后我会搜索我的 BST 以将 2018 年每个月的所有日期时间返回给我,然后通过地图访问我的记录以计算温度并取平均值。
请随时指出我正确的方向。我发现谷歌搜索如何创建对象和结构的 BST 给了我使用整数节点的 BST 实现,这还不够……?
-
\“在 C++ 中,我可以使用对象/结构作为节点创建二叉搜索树吗?\” - 简短回答:是的。
-
使用
operator <进行比较更常见,您应该编写BST 以这种方式使用比较。所以a > b宁愿写成b < a。您可以向 BST 添加额外的模板参数auto compare并将其用于比较。您也可以将其默认为std::less,这样它将成为可选的,如果BST 的数据类型有一个,则使用operator <。 -
您不应该将
Record结构转换为int以插入到BST中。这就是您将BST设为模板的原因,这样您就不必做那样的事情了。它应该只是一个BST<Record>。如果您还将lower_bound和upper_bound实现为与en.cppreference.com/w/cpp/algorithm/upper_bound 中的第二个版本匹配的模板函数,那么从2018 年累积所有Records 变得微不足道。