我正在研究的一个项目(C ++ 11)涉及一段代码,它将在数万亿次的某个地方运行。我在[1,N]中有一个整数参数B,而点1 = b1< b2< ......< bk = N,其中代码执行不同的小代码块,具体取决于B所处的区间[bi,b(i + 1))。整个执行过程中唯一改变的值是B.但是bi的值是# 39; s是固定的,它们仅在运行时确定。
天真的事情是编写一堆if和else if语句,在最坏的情况下涉及k比较。然而,可以在恒定时间内完成此操作:构造大小为N的向量myGotos并且在每个区间[bi,b(i + 1))存储相应代码块的位置。然后你就转到myGotos [B]。
上面的解决方案在我看来平均来说会更快,但代码会非常难看。我想知道是否有更好的方法来做到这一点。
答案 0 :(得分:1)
执行此操作的常用方法是使用switch语句
switch(B){
case b1:..//
break;
}
如果您可以将这些代码段声明为lambdas或std :: function,只要它们使用相同的参数。即使是模板化函数也可以。在不知道实际需要运行这些功能的情况下很难回答。
map<int,decltype(yourLambda)>
似乎它也能正常工作。
答案 1 :(得分:1)
初始化一个N
个插槽数组,让K
,其中每个插槽包含包含间隔的索引。
然后
switch (K[B])
{
case 1: // [B1,B2)
...
}