开始的第一方案的查询时间达到了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来实现的,下面就是具体的实现: