-1

我正在处理的一个项目 (C++11) 涉及一段代码,该代码块将在某处运行数万亿次。我在 [1,N] 中有一个整数参数 B 和点 1 = b1 < b2 < ... < bk = N 代码根据哪个区间 [bi, b(i+1) 执行不同的小代码块) B 在于。在整个执行过程中唯一变化的值是 B。但是,虽然 bi 的值是固定的,但它们仅在运行时确定。

天真的事情是写一堆 if 和 else if 语句,在最坏的情况下涉及 k 次比较。然而,可以在恒定时间内做到这一点:构造一个大小为 N 的向量 myGotos,并在每个区间 [bi, b(i+1)) 上存储相应代码块的位置。然后你只需执行 goto myGotos[B]。

在我看来,上面的解决方案平均起来会更快,但代码会非常难看。我想知道是否有更好的方法来做到这一点。

4

2 回答 2

1

执行此操作的常用方法是使用 switch 语句

switch(B){
case b1:..//
        break;
}

如果您可以将这些代码部分声明为 lambda 或 std::function,前提是它们采用相同的参数。即使是模板化函数也可以。在不知道运行这些功能的实际需要的情况下很难回答。

map<int,decltype(yourLambda)>

似乎它也可以正常工作。

于 2015-10-27T16:28:38.817 回答
1

初始化一个槽数组Nlet K,其中每个槽包含包含区间的索引。

然后

switch (K[B])
{
case 1: // [B1,B2)
...
}
于 2015-10-27T16:54:26.050 回答