加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 10:26:06 所属栏目:百科 来源:网络整理
导读:我理解如何为大多数本机元素(如int或字符串)实现二叉树.所以我可以理解一个std :: set的实现,它有一个类似的构造函数 switch(typeof(T)) // T being the typename/class in the implementation { case int: { /* create a binary tree structure that uses t
我理解如何为大多数本机元素(如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.>添加比较运算符(运算符<).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读