enum可以做索引
enum可以做索引
enum可以做索引, 配上虚函数,或者函数指针,可以实现上层的统一封装和快速索引。
点击(此处)折叠或打开
- MoTbl.cpp
- #include <stdio.h>
- #include <stdlib.h>
- enum {
- eA=0,
- eB,
- eC,
- eD,
- eMax
- };
- class Bs{
- public:
- virtual void say(){ printf("Bs\n"); }
- };
- class A: public Bs{
- int aa[1];
- public:
- void say(){printf("A\n");}
- void call(){printf("A::call\n");}
- };
- class B: public Bs{
- int aa[3];
- public:
- void say(){printf("B\n");}
- void sing(){printf("B::sing\n");}
- };
- class C: public Bs{
- int aa[10];
- public:
- void say(){printf("C\n");}
- };
- class D: public Bs{
- int aa[100];
- public:
- void say(){printf("D\n");}
- };
- class MoTbl{
- public:
- union{
- struct{
- A *a;
- B *b;
- C *c;
- D *d;
- }t;
- void *tv[eMax];
- };
- };
- int
- main ( int argc, char *argv[] )
- {
- int i = 0;
- MoTbl mt;
- A a;
- B b;
- C c;
- D d;
- printf("A:%d\n",sizeof(MoTbl));
- for(i=0; i<eMax; i++)
- printf("%p\n",mt.tv[i]);
- printf("--------------\n");
- mt.tv[eA] = &a;
- mt.tv[eB] = &b;
- mt.tv[eC] = &c;
- mt.tv[eD] = &d;
- for(i=0; i<eMax; i++)
- printf("%p\n",mt.tv[i]);
- printf("--------------\n");
- mt.t.a->say();
- printf("--------------\n");
- for(i=0; i<eMax; i++){
- switch(i){enum 做索引 2012-10-11 18:17:14
分类: C/C++
enum可以做索引, 配上虚函数,或者函数指针,可以实现上层的统一封装和快速索引。
点击(此处)折叠或打开
- MoTbl.cpp
- #include <stdio.h>
- #include <stdlib.h>
- enum {
- eA=0,
- eB,
- eC,
- eD,
- eMax
- };
- class Bs{
- public:
- virtual void say(){ printf("Bs\n"); }
- };
- class A: public Bs{
- int aa[1];
- public:
- void say(){printf("A\n");}
- void call(){printf("A::call\n");}
- };
- class B: public Bs{
- int aa[3];
- public:
- void say(){printf("B\n");}
- void sing(){printf("B::sing\n");}
- };
- class C: public Bs{
- int aa[10];
- public:
- void say(){printf("C\n");}
- };
- class D: public Bs{
- int aa[100];
- public:
- void say(){printf("D\n");}
- };
- class MoTbl{
- public:
- union{
- struct{
- A *a;
- B *b;
- C *c;
- D *d;
- }t;
- void *tv[eMax];
- };
- };
- int
- main ( int argc, char *argv[] )
- {
- int i = 0;
- MoTbl mt;
- A a;
- B b;
- C c;
- D d;
- printf("A:%d\n",sizeof(MoTbl));
- for(i=0; i<eMax; i++)
- printf("%p\n",mt.tv[i]);
- printf("--------------\n");
- mt.tv[eA] = &a;
- mt.tv[eB] = &b;
- mt.tv[eC] = &c;
- mt.tv[eD] = &d;
- for(i=0; i<eMax; i++)
- printf("%p\n",mt.tv[i]);
- printf("--------------\n");
- mt.t.a->say();
- printf("--------------\n");
- for(i=0; i<eMax; i++){
- switch(i){
- case eA: mt.t.a->say(); break;
- case eB: mt.t.b->say(); break;
- case eC: mt.t.c->say(); break;
- case eD: mt.t.d->say(); break;
- }
- }
- printf("--------------\n");
- for(i=0; i<eMax; i++)
- ((Bs *)mt.tv[i])->say();
- printf("--------------\n");
- for(i=0; i<eMax; i++){
- switch(i){
- case eA: mt.t.a->call(); break;
- case eB: mt.t.b->sing(); break;
- }
- }
- printf("--------------\n");
- }
输出
点击(此处)折叠或打开
- A:16
- 0xb7726ff4
- 0xb77238e4
- (nil)
- 0xb7615ff4
- --------------
- 0xbff0cd98
- 0xbff0cd88
- 0xbff0cd5c
- 0xbff0cbc8
- --------------
- A
- --------------
- A
- B
- C
- D
- --------------
- A
- B
- C
- D
- --------------
- A::call
- B::sing
- --------------
- case eA: mt.t.a->say(); break;
- case eB: mt.t.b->say(); break;
- case eC: mt.t.c->say(); break;
- case eD: mt.t.d->say(); break;
- }
- }
- printf("--------------\n");
- for(i=0; i<eMax; i++)
- ((Bs *)mt.tv[i])->say();
- printf("--------------\n");
- for(i=0; i<eMax; i++){
- switch(i){
- case eA: mt.t.a->call(); break;
- case eB: mt.t.b->sing(); break;
- }
- }
- printf("--------------\n");
- }
输出
点击(此处)折叠或打开
- A:16
- 0xb7726ff4
- 0xb77238e4
- (nil)
- 0xb7615ff4
- --------------
- 0xbff0cd98
- 0xbff0cd88
- 0xbff0cd5c
- 0xbff0cbc8
- --------------
- A
- --------------
- A
- B
- C
- D
- --------------
- A
- B
- C
- D
- --------------
- A::call
- B::sing
- --------------
enum可以做索引的更多相关文章
- redis为何单线程 效率还这么高 为何使用跳表不使用B+树做索引(阿里)
如果想了解 redis 与Memcache的区别参考:Redis和Memcache的区别总结 阿里的面试官问问我为何redis 使用跳表做索引,却不是用B+树做索引 因为B+树的原理是 叶子节点存储数 ...
- python中list不能做索引
先看python中内置的list不能作为字典的key. 可将list或者ndarray转化为tuple再做索引. list不能进行hash: import numpy as np a1 = np.ar ...
- 2020-05-18:MYSQL为什么用B+树做索引结构?平时过程中怎么加的索引?
福哥答案2020-05-18:此答案来自群员:因为4.0成型那个年代,B树体系大量用于文件存储系统,甚至当年的Longhorn的winFS都是基于b树做索引,开源而且好用的也就这么个体系了.B+树的磁 ...
- MySQL用B+树(而不是B树)做索引的原因
众所周知,MySQL的索引使用了B+树的数据结构.那么为什么不用B树呢? 先看一下B树和B+树的区别. B树 维基百科对B树的定义为"在计算机科学中,B树(B-tree)是一种树状数据结构, ...
- 为什么Mysql用B+树做索引而不用B-树或红黑树
B+树做索引而不用B-树 那么Mysql如何衡量查询效率呢?– 磁盘IO次数. 一般来说索引非常大,尤其是关系性数据库这种数据量大的索引能达到亿级别,所以为了减少内存的占用,索引也会被存储在磁盘上. ...
- 用xapian来做索引
最近一个项目需要正则搜索MongoDB,400多万的数据一次查询要20s以上,需要建立一个前端索引服务.本着部署简单.开发容易的原则,找到了xapian这个索引库. 我使用的是Python的接口,xa ...
- 为什么用B+树做索引&MySQL存储引擎简介
索引的数据结构 为什么不是二叉树,红黑树什么的呢? 首先,一般来说,索引本身也很大,不可能全部存在内存中,因此索引往往以索引文件的方式存在磁盘上.然后一般一个结点一个磁盘块,也就是读一个结点要进行一次 ...
- MySQL用B+树做索引
索引这个词,相信大多数人已经相当熟悉了,很多人都知道MySQL的索引主要以B+树为主,但是要问到为什么用B+树,恐怕很少有人能把前因后果讲述的很完整.本文就来从头到尾介绍下数据库的索引. 索引是一种数 ...
- mysql为什么用b+树做索引
关键字就是key的意思 一.B-Tree的性质 1.定义任意非叶子结点最多只有M个儿子,且M>2: 2.根结点的儿子数为[2, M]: 3.除根结点以外的非叶子结点的儿子数为[M/2, M]: ...
随机推荐
- 某网站经纬度Decode
<script type="text/javascript">$pi={"cid":2,"cn":"beijing&q ...
- 基于visual Studio2013解决C语言竞赛题之0613递归求积
题目
- Android 富文本框实现 RichEditText
Android系统自带控件没有富文本框控件,如果想写一封带格式的邮件基本上不可能,EdtiText只有默认一种格式,显示不能滿足要求,!!正好项目需要研究了一下,开发了此控件,现将一些源代码开放一下, ...
- Android UI 之WaterFall瀑布流效果
所谓瀑布流效果,简单说就是宽度相同但是高度不同的一大堆图片,分成几列,然后像水流一样向下排列,并随着用户的上下滑动自动加载更多的图片内容. 语言描述比较抽象,具体效果看下面的截图: ...
- Python,PIL压缩裁剪图片
自己写了用来压缩 DC 照片的,批量处理整目录文件,非常方便.需要安装 PIL #!/usr/bin/env python import Image import os import os.path ...
- sql和shell注入测试
1.整数型参数,必须intval转义,用addslashes转义不行 <?php $test = $_REQUEST["test"]; $test = addslashe ...
- 【linux】开发环境说明
欢迎转载,转载时请保留作者信息,谢谢. 邮箱:tangzhongp@163.com 博客园地址:http://www.cnblogs.com/embedded-tzp Csdn博客地址:http:// ...
- Linux的grep命令详解
简介 grep (global search regular expression(RE) and print out the line,全面搜索正则表达式并把行打印出来)是一种强大的文本搜索工具,它 ...
- Spring Boot 分布式Session状态保存Redis
在使用spring boot做负载均衡的时候,多个app之间的session要保持一致,这样负载到不同的app时候,在一个app登录之后,而打到另外一台服务器的时候,session丢失. 常规的解决方 ...
- 【VBA研究】VBA通过HTTP协议实现邮件轨迹跟踪查询
作者:iamlasong 1.接口说明 通过互联网訪问,运单跟踪信息查询接口基于HTTP协议开发,接口为RESTFul风格的Web Service,信息交互过程为用户按我方提供的web service ...