以查找表取代switch...case

C语言-查表法详解与实践 查表法是一种将复杂的条件判断转换为表驱动的编程技术,通过建立映射表来替代繁琐的if-else或switch-case语句。fill:#333;color:#333;color:#333;fill:none;查表法表结构定义查找算法数组映射结构体映射顺序查找索引查找查表法是一种简单而有效的编程技术,通过合理使用可以显著提升代码质量和运行效率。 阅读详情

转自:http://blog.youkuaiyun.com/hjsunj/article/details/2028597

传统的以多态取代switch...case

Martin Flower的著作《重构》告诉我们应该以多态取代switch...case,比如一个经典的Shape绘图的例子:


void Draw( Shape* shape ) {
    switch( shape.type ) {
        case line: dynamic_cast< Line* >( shape )->Draw(); break;
        case rect: dynamic_cast< Rect* >( shape )->Draw(); break;
    }
}

使用多态则变为:

void Draw( Shape* shape ) {
    shape->Draw();
}

注意前者的Draw为非虚函数,后者则为虚函数。

多态无法实施

可是并非switch...case总是处理多态对象,比如面对一个消息ID。
此时switch...case也并非如想象的那么遭糕,至少在其case条目比较少的情况下能够工作的很好。
比如下面这段处理消息的代码:

void FunctionA( Message* message );
...
void FunctionN( Message* message );

void HandleMessage( Message* message ) {
    switch ( message->GetID() ) {
        case MessageID_A:
            FunctionA( message );
            break;
        ...
        case MessageID_N:
            FunctionN( message );
            break;
        default:
            assert( false && "Unknown message" );
    }
}

switch...case效率低下

可是当消息变得越来越多时,switch...case的效率将成为问题,因为它执行的是个线性查找过程。
比如我们要查找的case条目正是最好一条,switch...case则会将比较前面的每一条case,此过程跟if..else if..else类似。

曙光:使用查找表

要提高查找速度,一个方法是使用查找表(你可以使用map查找或者对排序的vector做二分查找)。
第一步要做的就是做出一个Lookup函数,给一个ID返回一个值(函数指针或者其他),以封装switch...case过程。

可能的实现如下:

typedef void (*MsgFunc)( Message* message );

MsgFunc Lookup( Message* message ) {
    typedef map<int, MsgFunc> Registry;
    struct RegistryInitializer {
        const Registry& operator()() {
            static Registry registry;
            registry[MessageID_A] = &FunctionA;
            ...
            registry[MessageID_N] = &FunctionN;
            return registry;
        }
    };

    // 使用局部static实现惰性初始化
    static const Registry& registry = RegistryInitializer()();
    Registry::const_iterator it = registry.find( i );
    if ( it != registry.end() ) {
        return it->second;
    }
    else {
        assert( false && "Unknown message id" );
        return NULL;
    }
}

然后HandleMessage使用Lookup搜寻出处理函数并调用之。

void HandleMessage( Message* message ) {
    MsgFunc msgFunc = Lookup( message->GetID() );
    if ( msgFunc != NULL ) {
        (*msgFunc)();
    }   
    else {
        assert( false && "Unknown message" );
    }
}

可以看出使用查找表不但效率高,还可以将映射集中初始化,每次有新的条目增加进来,只需要简单的加一句

registry[MessageID_X] = &FunctionX;

至少比switch...case增加条目是少打几个字。

结论

在条目较少的情况时使用switch...case依然是个不错的选择,因为作出一个查找表并非是个轻松的工作;如果条目很多,那么用查找表吧!

AI分流之case/switch——kettle开发38 如上图所示,我们的 Switch / Case 组件,主要包括Switch字段,即我们用于判断的字段,然后就是指定字符串的类型,掩码和小数点的符号等用来处理一些特殊数据。下面的case 值就是通过Switch字段里面的不同值,执行不同的目标步骤。下面的默认目标步骤即当Switch字段数值都不在case值里头就执行默认目标步骤。类似:case when Switch字段=1 then 目标步骤1when Switch字段=2 then 目标步骤2else 默认目标步骤。2、总结。 阅读详情

相关推荐

使用KITTI数据集测试不同算法的性能

该文章将使用同一个kitti数据集来测试不同算法的性能,目前已经测试的算法包括:LIO-SAM,FAST-LIO2,Point-LIO,Faster-LIO。

wwtx的博客 2586

查表法与switch有什么区别?

查表法和switch的能力有很大重合,两者都可通过“索引”找到指定元素,但它们有哪些区别呢?在不同场景下我们应如何选择?

679

电影票购票小程序搭建(源码部署)

答:为用户提供便捷的购票方式,包括授权登录、个性化推荐、在线选座、订单管理等功能,同时在界面设计上注重用户友好性,简化用户的购票流程。答:通过展示电影院的优惠活动和票价信息,同时提供电影推荐功能,根据用户的历史购票记录和电影评分推荐个性化的电影列表,吸引用户购票。编写页面逻辑代码:使用JavaScript编写小程序页面的逻辑代码,实现电影列表的获取、电影详情的展示、座位选择的逻辑等。设计小程序界面:使用WXML和WXSS编写小程序的界面代码,实现电影列表的展示、电影详情的样式、座位选择页面的布局等。

2301_79072569的博客 2068

c语言switch做表格,汇编如何实现查表(C语言中的case - switch分支功能)

汇编如何实现C语言中的分支功能?C语言:switch (R_DSP_BUFFER1){case lable1:statement;case lable1:statement;case lable1:statement;........default :statement;}汇编语言:movfw R_DSP_BUFFER1 // 将 switch的值赋值...

weixin_33516557的博客 460

团子杂记:SAP收入确认工具RAR(Revenue Recognition&Reporting)在新收入准则下的应用

SAP收入确认工具RAR知识分享

Lucas1211的博客 4284

ArcGIS 10.2.2自带Python 2.7.5环境配置全攻略:从pip安装到gdal、arcpy调用

本文详细指导如何在ArcGIS 10.2.2自带的Python 2.7.5环境中进行高效配置。核心内容包括安装pip包管理器、部署gdal等关键地理数据处理库,并确保arcpy模块的无缝调用。通过解决路径配置与PyCharm集成问题,帮助用户在此经典环境中构建稳定、兼容的地理信息自动化工作流,有效连接ArcGIS桌面功能与Python脚本编程。

moon9的博客 767

汇编如何实现查表(C语言中的case - switch分支功能)

        汇编如何实现C语言中的分支功能? C语言:         switch (R_DSP_BUFFER1)         {                case lable1:statement;                case lable1:statement;                case lable1:statement;         ...

chipsea_mltsum的博客 2625

电磁场可视化

电磁场可视化 如题,做了电磁场可视化这么久了,也是颇有些心得了,简单描述一下怎么做这个项目的。 开始时是从最基本的OpenGL开始做的,必不可少的翻了许多的文献,后来是直接在unity中做,发现效果挺好,而且可控性强好多。反复琢磨后,发现可视化的渲染,有几种思路,第一就是用linerender,画线的方法,另一种就是用shader。 第一种我通过unity自带的linewave插件可以做到 详细的就是,linewave插件可以轻松画出曲线等,并且可以添加碰撞,控制频率幅度长度等一切的条件数值,而且令人惊喜

weixin_43979140的博客 1671

switch case语句用法详解

switch “开关”的意思,是一种“选择”语句,它用法非常简单。switch 是多分支选择语句。说得通俗点,多分支就是多个 if语句的组合。从功能上说,switch 语句和 if 语句完全可以相互取代。但从编程的角度,它们又各有各的特点,所以至今为止也不能说谁可以完全取代谁。 当嵌套的 if 比较少时(三个以内),用 if 编写程序会比较简洁。但是当选择的分支比较多时,嵌套的 if 语句层数就...

BestEternity的博客 10万+

卫星轨道坐标转换:轨道六根数到经纬高(经STK验证)

a:半长轴(km)e:偏心率i:轨道倾角(度)Ω:升交点赤经(度)ω:近地点幅角(度)ν:真近点角(度)

weixin_52370774的博客 170

【QT开发教程】如何在Qt中使用Protobuf进行高效数据序列化

Protocol Buffers(Protobuf)是Google开发的一种语言中立、平台中立、可扩展的序列化机制,常用于数据交换和存储。Qt作为一个跨平台的C++图形用户界面应用框架,可以与Protobuf结合使用,实现高效的数据序列化和反序列化。本文将介绍如何在Qt中集成和使用Protobuf,包括基本概念、安装步骤、使用示例以及实际应用。

科技改变人类,技术成就未来 1443

Switch-Case详解

3、当switch后面括号内“表达式”的值与某个case后面的“常量表达式”的值相等时,就执行此case后面的语句。4、若所有的case中的常量表达式的值都没有与switch后面括号内“表达式”的值相等的,就执行default后面的语句,default是“默认”的意思。根据switch表达式中的值,依次匹配各个case中的常量。我们写分支结构时,当发现既可以使用switch-case,(同时,switch中表达式的取值情况不太多), 又可以使用if-else时,我们优先选择使用switch-case。

2301_76217337的博客 2520

Allegro快速编辑丝印文字操作指导

选择setup-Application Mode-placement edit。Allegro支持丝印文字的编辑,下面介绍快速编辑丝印文字的两种方法如下。这个功能还支持拷贝粘贴,可以从其它地方拷贝过来,免去了书写的麻烦。出现text edit窗口,输入自己需要的文字,点击ok。鼠标移动到丝印文字位置,文字会被高亮起来。Allegro快速编辑丝印文字操作指导。点击丝印文字,丝印会被高亮起来。选择Text edit 命令。输入需要更改后的文字,如下。右击选择text edit。以编辑下方丝印文字为例。

weixin_54787054的博客 4193

C语言之switch-case语句

不要拿青龙偃月刀去削苹果 那你既然有了菜刀为什么还需要水果刀呢?一把好刀是一个厨子的很重要的东西,而在做菜时不可能只有一把刀,有的刀适合切菜,有的刀适合剁肉,有的刀适合剔骨......if、else 一般表示两个分支或是嵌套表示少量的分支,但如果分支很多的话……还是用 switch、case 组合吧。

2301_80950699的博客 3632

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Simulink学习——switch-case语义的实现(switch-case子系统)

相关组件学习 实现switch-case的相关components: Switch case 模块 simulink help文档说明: 功能与if模块很像,但是通过一个模块进行多个条件判断,有点像if-elif-else的功能。通过修改case condition中括号内的值,可以扩展出多个case: 而与if模块相似的,switch-case模块的输出可以配合 switch-case action subsystem使用。 一样的,当输出口与子系统连接起来的时...

一大块肥皂的博客 1万+

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

switch case,C语言switch case详解(给新手写的)

在 C 语言里,实现分支结构的方式大致有两种,分别是用 if else 语句和 switch case 语句。这篇文章我主要带读者掌握 switch case 语句的用法。

zdoeo的博客 3018

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

switch case default

switch case default

m0_64007130的博客 7726

Java 【switch case】 语句

switch case 语句判断一个变量与一系列值中某个值是否相等,每个值称为一个分支。

M133706898的博客 3394

switch-case

switch语句

时光里的博客 2万+

switch-case选择结构

第2步:执行完此case的执行语句以后, ​ 情况1:如果遇到break,则执行break并跳出当前的switch-case结构 ​ 情况2:如果没有遇到break,则会继续执行当前case之后的其它case中的执行语句。随机产生3个1-6的整数,如果三个数相等,那么称为“豹子”,如果三个数之和大于9,称为“大”,如果三个数之和小于等于9,称为“小”,用户从键盘输入押的是“豹子”、“大”、“小”,并判断是否猜对了。如果表达式的值等于某个case中的常量值,则执行对应case中的执行语句。

m0_59281987的博客 1880

[系统安全] 反汇编-switch-case分支

跳转表的作用就是用数组的寻址运算代替复杂的if-else分支,可以大大提高程序的执行效率。由此引出稀疏矩阵的知识点。由于代码中的switch-case分支结构拥有6个分支,因此间接表里保存的索引内容都是在0-5之间的,然后根据索引来确定跳转到第几个分支上去。case2至case5里保存的地址都是Default分支的地址,这就证明这几个case在程序的源代码中是属于未处理的状态。间接表的应用只限于小于等于256的情况,如果超过256这种与跳转表相配合的间接表就会失效,取而代之的便是著名的二叉树了。

2401_88755455的博客 990

python中case的用法_用 Python 实现简单的 switch/case 语句

在Python中是没有Switch / Case语句的,很多人认为这种语句不够优雅灵活,在Python中用字典来处理多条件匹配问题字典会更简单高效,对于有一定经验的Python玩家不得不承认,的确如此。但今天我们还是来看看如果一定要用Python来Switch / Case,可以怎么玩。语法约束我们先定义一下Switch/Case应该怎么表达,为了简单我们可以让它长成这样。def cn():pri...

weixin_39928648的博客 7563

【Java switch case 语句default位置问题】你真的了解switch吗

在日常开发中,小伙伴们在使用switch case`语句时,有的习惯不加default,有的将default放在首位,甚至粗心的小伙伴会漏掉break。那么会对代码的运行产生什么影响呢?接下来将对这些情况进行测试。

7me 1万+

分支语句——switch-case

1.switch格式 switch(表达式) { case 常量1: 执行语句1; //break;(根据情况决定是否要) case 常量2: 执行语句2 //break; ... default: 执行语句n; //break; } 2.switch语句说明 根据switch表达式中的值,依次匹配各个case中的常量。一旦匹配成功,则进入相应case结构中,调用其执行语句。当调用完执行语句后,则任然继续向下执行其他case结构中的执行语句,直到遇到bre

DreamBeliever的博客 2931

Java switch case 语句

switch case 语句判断一个变量与一系列值中某个值是否相等,每个值称为一个分支。

Aforxiaoxie 1168
上一篇: 工厂方法(Factory Method)之追根究底
下一篇: 简单单体模板类的实现(非线程安全)
lclflash
博客等级 码龄20年 10粉丝 3原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值