Modern C++ Design 笔记 第十一章 MultiMethods(3)收藏

本文详细介绍了C++中实现MultiMethods的三种方案,从最初的O(n)查询时间,到O(log(n)),再到常数时间O(1)的优化。通过使用Hashtable和std::vector构建二维矩阵,实现了常数时间查找的FastDispatcher,其中每个类都有一个唯一的index。虽然这种方法牺牲了非侵入性,但提供了高效的功能调度。
摘要由CSDN通过智能技术生成

开始的第一方案的查询时间达到了O(n),我们认为在类的数量比较少的时候是可行的。在进入了第二方案的时候,我们让查询速度时间缩短到了O(log(n)),如果我们要在这里更进一步的话,那就应该是O(1)了。在这里我们就继续推出这个所谓的常数时间方案。

在第二方案的时候,我们需要对数时间的比较来得到答案,如果是常数时间,那必须摒弃这种比较。参照前面的思路继续往下,前面的map如果改成hashtable应该就可以了,每次对key通用运算就得到了对应value(就是函数或者functor)而这里的key就是两个类型参数组成的pair。但是Hashtable带来了一定的复杂性和不稳定性。这里大名鼎鼎的Alex给出的更直接稳定的方案就是直接把每个类都添加进一个index,通过2个index在二维数组中找到对应的处理函数(或者Functor)。这里有一张文中的示意图:

示意图

可以看到如果以后的处理函数是Rectangle,Screen的话,我们就找1,1这个点。类似的如果处理Circle在Printer上打印的话,我们就找3,4这个点对应的函数。这个用空间换取时间的方案就是通过std::vector来实现的,下面就是具体的实现:

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值