C的std :: set类如何能够为任何类型的数据结构实现二叉树?

C的std :: set类如何能够为任何类型的数据结构实现二叉树?,第1张

概述我理解如何为大多数本机元素(如int或字符串)实现二叉树.所以我可以理解一个std :: set的实现,它有一个类似的构造函数 switch(typeof(T)) // T being the typename/class in the implementation { case int: { /* create a binary tree structure that u 我理解如何为大多数本机元素(如int或字符串)实现二叉树.所以我可以理解一个std :: set的实现,它有一个类似的构造函数

switch(typeof(T)) // T being the typename/class in the implementation {  case int:   {      /* create a binary tree structure that uses the bitshift operator to          add elements,e.g. 13=1101 is created as                                      /                                     /                                    /                                   /                                  1                                 /                                /                               /                              1                               \                                \                                 0                                /                               1      */  }  case string:   {      /* Do something where the string is added to a tree by going letter-by-letter          and looking whether the letter is in the second half of the Alphabet (?)      */  }  // etcetera for every imaginable type}

但显然这不是std :: set实际实现的方式,因为即使我使用自制的数据结构,也可以创建树

struct myStruct{      char c;       bool b;};std::set<myStruct> mySet;

是否有可能创建一个通用的二叉树类来查看数据结构的所有位,并执行类似我上面提到的int情况?

例如,在myStruct的情况下,结构的大小是2个字节的16位,所以myStruct元素S的S.c =’!’和S.b = true看起来像

00010101 00000001(c part) (b part)=                              \                              \                               0                                \                                 \                                  0                                   \                                    \                                     0                                    /                                   /                                  1                                   \                                 [etcetera]

因为’!’的ASCII值因为int是1,所以这可能是低效的,因为非常大的数据结构将对应于可能需要更多时间遍历然后只进行基本线性搜索的巨大树,因此它是21并且bool = true.要素.

那有意义吗?我真的很困惑,如果有人在这里可以让我直截了当,我会很高兴.

解决方法 What you want is a good book on templates and template meta-programming.

简而言之,std :: set类只定义了一个类的原型,然后使用提供的参数在一个编译类型实例化(一些Key-type Key,一些值类型T,它推导出std :: less< Key&gt ;和std :: allocator< std :: pair< Key,T>>如果没有给出,或者其他什么).

灵活性的很大一部分来自于能够创建部分特化以及使用其他模板和默认参数.

现在,std :: less是为许多标准库类型和所有基本类型定义的,但不是为自定义类型定义的.

有3种方法可以提供比较std :: map的需求:

>覆盖默认模板参数并将其提供给模板(如果覆盖具有状态,则向构造函数提供对象可能是有意义的).>专业化std :: less.>添加比较运算符(运算符<).

总结

以上是内存溢出为你收集整理的C的std :: set类如何能够为任何类型的数据结构实现二叉树?全部内容,希望文章能够帮你解决C的std :: set类如何能够为任何类型的数据结构实现二叉树?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1220102.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存