enum可以做索引

enum可以做索引, 配上虚函数,或者函数指针,可以实现上层的统一封装和快速索引。

点击(此处)折叠或打开

  1. MoTbl.cpp
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. enum {
  5. eA=0,
  6. eB,
  7. eC,
  8. eD,
  9. eMax
  10. };
  11. class Bs{
  12. public:
  13. virtual void say(){ printf("Bs\n"); }
  14. };
  15. class A: public Bs{
  16. int aa[1];
  17. public:
  18. void say(){printf("A\n");}
  19. void call(){printf("A::call\n");}
  20. };
  21. class B: public Bs{
  22. int aa[3];
  23. public:
  24. void say(){printf("B\n");}
  25. void sing(){printf("B::sing\n");}
  26. };
  27. class C: public Bs{
  28. int aa[10];
  29. public:
  30. void say(){printf("C\n");}
  31. };
  32. class D: public Bs{
  33. int aa[100];
  34. public:
  35. void say(){printf("D\n");}
  36. };
  37. class MoTbl{
  38. public:
  39. union{
  40. struct{
  41. A *a;
  42. B *b;
  43. C *c;
  44. D *d;
  45. }t;
  46. void *tv[eMax];
  47. };
  48. };
  49. int
  50. main ( int argc, char *argv[] )
  51. {
  52. int i = 0;
  53. MoTbl mt;
  54. A a;
  55. B b;
  56. C c;
  57. D d;
  58. printf("A:%d\n",sizeof(MoTbl));
  59. for(i=0; i<eMax; i++)
  60. printf("%p\n",mt.tv[i]);
  61. printf("--------------\n");
  62. mt.tv[eA] = &a;
  63. mt.tv[eB] = &b;
  64. mt.tv[eC] = &c;
  65. mt.tv[eD] = &d;
  66. for(i=0; i<eMax; i++)
  67. printf("%p\n",mt.tv[i]);
  68. printf("--------------\n");
  69. mt.t.a->say();
  70. printf("--------------\n");
  71. for(i=0; i<eMax; i++){
  72. switch(i){enum 做索引 2012-10-11 18:17:14

    分类: C/C++

    enum可以做索引, 配上虚函数,或者函数指针,可以实现上层的统一封装和快速索引。

    点击(此处)折叠或打开

    1. MoTbl.cpp
    2. #include <stdio.h>
    3. #include <stdlib.h>
    4. enum {
    5. eA=0,
    6. eB,
    7. eC,
    8. eD,
    9. eMax
    10. };
    11. class Bs{
    12. public:
    13. virtual void say(){ printf("Bs\n"); }
    14. };
    15. class A: public Bs{
    16. int aa[1];
    17. public:
    18. void say(){printf("A\n");}
    19. void call(){printf("A::call\n");}
    20. };
    21. class B: public Bs{
    22. int aa[3];
    23. public:
    24. void say(){printf("B\n");}
    25. void sing(){printf("B::sing\n");}
    26. };
    27. class C: public Bs{
    28. int aa[10];
    29. public:
    30. void say(){printf("C\n");}
    31. };
    32. class D: public Bs{
    33. int aa[100];
    34. public:
    35. void say(){printf("D\n");}
    36. };
    37. class MoTbl{
    38. public:
    39. union{
    40. struct{
    41. A *a;
    42. B *b;
    43. C *c;
    44. D *d;
    45. }t;
    46. void *tv[eMax];
    47. };
    48. };
    49. int
    50. main ( int argc, char *argv[] )
    51. {
    52. int i = 0;
    53. MoTbl mt;
    54. A a;
    55. B b;
    56. C c;
    57. D d;
    58. printf("A:%d\n",sizeof(MoTbl));
    59. for(i=0; i<eMax; i++)
    60. printf("%p\n",mt.tv[i]);
    61. printf("--------------\n");
    62. mt.tv[eA] = &a;
    63. mt.tv[eB] = &b;
    64. mt.tv[eC] = &c;
    65. mt.tv[eD] = &d;
    66. for(i=0; i<eMax; i++)
    67. printf("%p\n",mt.tv[i]);
    68. printf("--------------\n");
    69. mt.t.a->say();
    70. printf("--------------\n");
    71. for(i=0; i<eMax; i++){
    72. switch(i){
    73. case eA: mt.t.a->say(); break;
    74. case eB: mt.t.b->say(); break;
    75. case eC: mt.t.c->say(); break;
    76. case eD: mt.t.d->say(); break;
    77. }
    78. }
    79. printf("--------------\n");
    80. for(i=0; i<eMax; i++)
    81. ((Bs *)mt.tv[i])->say();
    82. printf("--------------\n");
    83. for(i=0; i<eMax; i++){
    84. switch(i){
    85. case eA: mt.t.a->call(); break;
    86. case eB: mt.t.b->sing(); break;
    87. }
    88. }
    89. printf("--------------\n");
    90. }

    输出

    点击(此处)折叠或打开

    1. A:16
    2. 0xb7726ff4
    3. 0xb77238e4
    4. (nil)
    5. 0xb7615ff4
    6. --------------
    7. 0xbff0cd98
    8. 0xbff0cd88
    9. 0xbff0cd5c
    10. 0xbff0cbc8
    11. --------------
    12. A
    13. --------------
    14. A
    15. B
    16. C
    17. D
    18. --------------
    19. A
    20. B
    21. C
    22. D
    23. --------------
    24. A::call
    25. B::sing
    26. --------------
  73. case eA: mt.t.a->say(); break;
  74. case eB: mt.t.b->say(); break;
  75. case eC: mt.t.c->say(); break;
  76. case eD: mt.t.d->say(); break;
  77. }
  78. }
  79. printf("--------------\n");
  80. for(i=0; i<eMax; i++)
  81. ((Bs *)mt.tv[i])->say();
  82. printf("--------------\n");
  83. for(i=0; i<eMax; i++){
  84. switch(i){
  85. case eA: mt.t.a->call(); break;
  86. case eB: mt.t.b->sing(); break;
  87. }
  88. }
  89. printf("--------------\n");
  90. }

输出

点击(此处)折叠或打开

  1. A:16
  2. 0xb7726ff4
  3. 0xb77238e4
  4. (nil)
  5. 0xb7615ff4
  6. --------------
  7. 0xbff0cd98
  8. 0xbff0cd88
  9. 0xbff0cd5c
  10. 0xbff0cbc8
  11. --------------
  12. A
  13. --------------
  14. A
  15. B
  16. C
  17. D
  18. --------------
  19. A
  20. B
  21. C
  22. D
  23. --------------
  24. A::call
  25. B::sing
  26. --------------

enum可以做索引的更多相关文章

  1. redis为何单线程 效率还这么高 为何使用跳表不使用B+树做索引(阿里)

    如果想了解 redis 与Memcache的区别参考:Redis和Memcache的区别总结 阿里的面试官问问我为何redis 使用跳表做索引,却不是用B+树做索引 因为B+树的原理是 叶子节点存储数 ...

  2. python中list不能做索引

    先看python中内置的list不能作为字典的key. 可将list或者ndarray转化为tuple再做索引. list不能进行hash: import numpy as np a1 = np.ar ...

  3. 2020-05-18:MYSQL为什么用B+树做索引结构?平时过程中怎么加的索引?

    福哥答案2020-05-18:此答案来自群员:因为4.0成型那个年代,B树体系大量用于文件存储系统,甚至当年的Longhorn的winFS都是基于b树做索引,开源而且好用的也就这么个体系了.B+树的磁 ...

  4. MySQL用B+树(而不是B树)做索引的原因

    众所周知,MySQL的索引使用了B+树的数据结构.那么为什么不用B树呢? 先看一下B树和B+树的区别. B树 维基百科对B树的定义为"在计算机科学中,B树(B-tree)是一种树状数据结构, ...

  5. 为什么Mysql用B+树做索引而不用B-树或红黑树

    B+树做索引而不用B-树 那么Mysql如何衡量查询效率呢?– 磁盘IO次数. 一般来说索引非常大,尤其是关系性数据库这种数据量大的索引能达到亿级别,所以为了减少内存的占用,索引也会被存储在磁盘上. ...

  6. 用xapian来做索引

    最近一个项目需要正则搜索MongoDB,400多万的数据一次查询要20s以上,需要建立一个前端索引服务.本着部署简单.开发容易的原则,找到了xapian这个索引库. 我使用的是Python的接口,xa ...

  7. 为什么用B+树做索引&MySQL存储引擎简介

    索引的数据结构 为什么不是二叉树,红黑树什么的呢? 首先,一般来说,索引本身也很大,不可能全部存在内存中,因此索引往往以索引文件的方式存在磁盘上.然后一般一个结点一个磁盘块,也就是读一个结点要进行一次 ...

  8. MySQL用B+树做索引

    索引这个词,相信大多数人已经相当熟悉了,很多人都知道MySQL的索引主要以B+树为主,但是要问到为什么用B+树,恐怕很少有人能把前因后果讲述的很完整.本文就来从头到尾介绍下数据库的索引. 索引是一种数 ...

  9. mysql为什么用b+树做索引

    关键字就是key的意思 一.B-Tree的性质 1.定义任意非叶子结点最多只有M个儿子,且M>2: 2.根结点的儿子数为[2, M]: 3.除根结点以外的非叶子结点的儿子数为[M/2, M]: ...

随机推荐

  1. java设计模式之——策略模式

    1.策略模式有什么好处? 策略模式的好处在于你可以动态的改变对象的行为. 2.设计原则 设计原则是把一个类中经常改变或者将来可能改变的部分提取出来,作为一个接口(c++中可以用虚类),然后在类中包含这 ...

  2. 从汇编角度来理解linux下多层函数调用堆栈执行状态

    注:在linux下开发经常使用的辅助小工具: readelf .hexdump.od.objdump.nm.telnet.nc 等,详细能够man一下. 我们用以下的C代码来研究函数调用的过程.  C ...

  3. android事件传递机制以及onInterceptTouchEvent()和onTouchEvent()详解二之小秘与领导的故事

    总结的不是很好,自己也有点看不懂,正好现在用到了,研究了一个,再次总结,方便大家查看 总则: 1.onInterceptTouchEvent中有个Intercept,这是什么意思呢?她叫拦截,你大概知 ...

  4. linux head命令

    head 与 tail 就像它的名字一样的浅显易懂,它是用来显示开头或结尾某个数量的文字区块,head 用来显示档案的开头至标准输出中,而 tail 想当然尔就是看档案的结尾. 1.命令格式: hea ...

  5. javascript笔记整理(DOM对象)

    DOM--document(html xml) object modle,document对象(DOM核心对象),document对象是 Window 对象的一部分,可通过window.documen ...

  6. WCF技术剖析之十六:数据契约的等效性和版本控制

    原文:WCF技术剖析之十六:数据契约的等效性和版本控制 数据契约是对用于交换的数据结构的描述,是数据序列化和反序列化的依据.在一个WCF应用中,客户端和服务端必须通过等效的数据契约方能进行有效的数据交 ...

  7. 减少可执行程序size的三个常用软件

    减少可执行程序size的三个常用软件 linux下面,直接用strip 这个命令 #:strip xxx 可以去掉编译调试信息和各种符号表,能够大大减小可执行程序size windows下面这种exe ...

  8. gdi+ 高速绘制透明窗体

    gdi+ 高速绘制透明窗体: 方法一: 1.用Iamge对象载入png资源, 2.调用drawimage函数讲图片绘制出了 3.UpdateLayeredWindow对窗体进行布局 方法二: 1.用B ...

  9. extjs_04_grid(弹出窗口&amp;行编辑器 CRUD数据)

    1.弹出窗口(添加.删除) watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYWRhbV93enM=/font/5a6L5L2T/fontsize/400/f ...

  10. 改变Emacs下的注释代码方式以支持当前行(未选中情况下)的注释/反注释

    Emacs下支持多行代码的注释/反注释,命令是comment-or-uncomment-region. 我喜欢把它绑定在快捷键C-c C-/上,如下: (global-set-key [?\C-c ? ...