【问题标题】:Generic B-Tree to store custom objects/data types用于存储自定义对象/数据类型的通用 B-Tree
【发布时间】:2017-10-31 06:11:14
【问题描述】:

我想要一个 B-Tree,它可以存储任何类型的数据。甚至可能是自定义对象和数据类型。例如:我可能会存储一些整数、一些字符串(“例如:jack、jill 等)甚至一些自定义对象(MyClass obj1、obj2 等)。

我想知道的是,如何插入/删除/搜索对象并维护 Tree ?我可以将比较操作用于整数,但其他类型,如字符串、自定义对象等呢?

我也想知道,设计课程的最佳方式是什么?我可以想到两个选择:

  1. 我使用一个类模板并为每个模板编写专业化。这真的很麻烦,对我来说最不优选。

  2. 我使用带有虚拟 get/set 方法的 Tree 节点的抽象基类。每个节点都有一个唯一的整数“键”属性,可用于树操作中的比较。我所有的数据类型都必须从这个类派生。在这种情况下,我可以编写一个 compare() 来比较键。我在这里看到的一个大缺点是密钥的维护,这需要另一个 ds 像堆栈。

请让我知道您对未来最佳方式的意见。提前致谢!!

【问题讨论】:

  • 看看std::set。恕我直言,它显示了如何解决您的问题。注意:要用于键值的数据类型需要哪些运算符。例如。 std::set 有一个 less 仿函数的模板参数。默认参数是使用operator < 作为键的参数。顺便提一句。 AFAIK,std::set 在内部使用树。
  • 顺便说一句。一些广告:在我对SO: Preorder traversal through Morse code BST 的回答中,我使用了树模板(只是为了好玩)。在这个示例中,我可以将树节点的类模板嵌入到树的类模板中。因此,树节点类模板将成为一个类。我这样做并不是为了不让提问者感到困惑。

标签: c++ data-structures


【解决方案1】:

在节点中声明一个 void 指针,如下所示。您可以在哪里存储任何类型的地址。但是在搜索树时,您必须检查每种类型,

void* val;

node->val = pointer of a int //ok
node->val = pointer of a char//ok
node->val = pointer of a object including user define type//ok

【讨论】:

    猜你喜欢
    • 2015-08-09
    • 1970-01-01
    • 1970-01-01
    • 2010-12-31
    • 2016-03-25
    • 2014-04-12
    • 1970-01-01
    • 1970-01-01
    • 2015-11-04
    相关资源
    最近更新 更多