在一些 C++ 代码中,我正在迭代一个具有索引 (0-7) 的数组,并需要从某个以
a
作为输入的函数计算给定值集 b
和 i
的最佳方法。
i: 0 1 2 3 4 5 6 7
---------------------------
a: -1 1 -2 2 1 -1 2 -2
b: 2 2 1 1 -2 -2 -1 -1
显而易见的解决方案是使用 if 语句。通过一些挖掘和数学,这是我能想到的最好的-
int a = (i%4 == i%2) ? (!(i>=4 ^ i%2) ? -1 : 1) : (!(i>=4 ^ i%2) ? -2 : 2);
int b = (i%4 == i%2) ? (i>=4 ? -2 : 2) : (i>=4 ? -1 : 1);
我发现这段代码非常笨拙,想知道最优化的方法来做到这一点。
我会使用 constexpr 成对的数组,或 c 数组和结构,或这些的任何组合。
完全未经测试的代码
using PairsArray = std::array<std::pair<int, int>, 8>;
constexpr PairsArray PA {
{ -1,2 }, { 1,2 }, { -2, 1 }, {2, 1} // and so on
}
constexpr int DoStuff(int i) {
return PA[i].first*3+PA[i]*-2;
}
如果可以在编译时完成,则可能计算对 DoStuff 的调用。