在 c++ 开关案例中引入循环
To introduce loop inside c++ switch- case
我正在尝试使用此开关 - case 语句。我想知道是否有任何其他有效的方法来编写此代码。"功能"原型是:int function(int a,int b, int c,int d)
switch (u) {
case 1:
t = t + function(0,2,1,0); // 1
break;
case 2:
t = t + function(0,2,1,0); // 1
t = t + function(1,2,2,0); // 2
break;
case 3:
t = t + function(0,2,1,0) ; // 1
t = t + function(1,2,2,0) ; // 2
t = t + function(0,3,3,1) ; // 3
break;
case 4:
t = t + function(0,2,1,0) ; // 1
t = t + function(1,2,2,0) ; // 2
t = t + function(0,3,3,1) ; // 3
t = t + function(1,3,4,1) ; // 4
t = t + function(3,2,4,0) ; // 6
break;
case 5:
t = t + function(0,2,1,0) ; // 1
t = t + function(1,2,2,0) ; // 2
t = t + function(0,3,3,1) ; // 3
t = t + function(1,3,4,1) ; // 4
t = t + function(2,3,5,1) ; // 5
t = t + function(3,2,4,0) ; // 6
t = t + function(4,2,5,0) ; // 7
break;
case 6:
t = t + function(0,2,1,0) ; // 1
t = t + function(1,2,2,0) ; // 2
t = t + function(0,3,3,1) ; // 3
t = t + function(1,3,4,1) ; // 4
t = t + function(2,3,5,1) ; // 5
t = t + function(3,2,4,0) ; // 6
t = t + function(4,2,5,0) ; // 7
t = t + function(3,3,6,1) ; // 8
break;
case 7:
t = t + function(0,2,1,0) ; // 1
t = t + function(1,2,2,0) ; // 2
t = t + function(0,3,3,1) ; // 3
t = t + function(1,3,4,1) ; // 4
t = t + function(2,3,5,1) ; // 5
t = t + function(3,2,4,0) ; // 6
t = t + function(4,2,5,0) ; // 7
t = t + function(3,3,6,1) ; // 8
t = t + function(4,3,7,1) ; // 9
t = t + function(6,2,7,0) ; // 11
break;
case 8:
t = t + function(0,2,1,0) ; // 1
t = t + function(1,2,2,0) ; // 2
t = t + function(0,3,3,1) ; // 3
t = t + function(1,3,4,1) ; // 4
t = t + function(2,3,5,1) ; // 5
t = t + function(3,2,4,0) ; // 6
t = t + function(4,2,5,0) ; // 7
t = t + function(3,3,6,1) ; // 8
t = t + function(4,3,7,1) ; // 9
t = t + function(5,3,8,1) ; // 10
t = t + function(6,2,7,0) ; // 11
t = t + function(7,2,8,0) ; // 12
break;
}
有没有办法缩短这段代码?
每个新案例都具有相同的功能,直到前一个案例加上一个或两个新功能。
最终目标:目标是在代码中减少代码和手动输入。
请发布答案以减少代码长度。
到目前为止发布的所有答案都没有考虑自动创建数字本身,因为即使这些数字也有模式。
反转大小写并删除所有break
。然后删除常见+=
:
switch (u)
{
case 8:
t += function(5, 3, 8, 1); // 11
t += function(7, 2, 8, 0); // 12
case 7:
t += function(4, 3, 7, 1); // 9
t += function(6, 2, 7, 0); // 10
case 6:
t += function(4, 2, 5, 0); // 7
t += function(3, 3, 6, 1); // 8
case 5:
t += function(2, 3, 5, 1); // 5
t += function(4, 2, 5, 0); // 6
case 4:
t += function(1, 3, 4, 1); // 4
t += function(3, 2, 4, 0); // 5
case 3:
t += function(0, 3, 3, 1); // 3
case 2:
t += function(1, 2, 2, 0); // 2
case 1:
t += function(0, 2, 1, 0); // 1
}
这里的一个选择是创建一个包含四个可能选项的数组到function
;以及将这些参数中的哪一个用于任何u
值的映射。
然后,您可以在循环中使用映射的参数执行这些调用。
喜欢这个:
int params[12][4] = {
{0,2,1,0}, // 1
{1,2,2,0}, // 2
{0,3,3,1}, // 3
// ...
};
vector<vector<int> > paramMapping;
paramMapping.push_back({1});
paramMapping.push_back({{1, 2});
paramMapping.push_back({{1, 2, 3});
paramMapping.push_back({{1, 2, 3, 4, 6});
paramMapping.push_back({{1, 2, 3, 4, 5, 6, 7});
// ..
vector<int>::iterator it = paramMapping[u-1].begin();
while (it != paramMapping[u-1].end())
{
int i = (*it) - 1;
t += function(params[i][0], params[i][1], params[i][2], params[i][3]);
++it;
}
与 M M 答案中的故障切换相反,此解决方案将使function
调用的调用顺序与原始代码中的调用顺序相同(如果function
有副作用,这可能很重要,如注释中所述)。
params
和paramMapping
的初始化最好在实际计算函数之外完成(例如,在包含该函数的类的初始化中的某个地方)。
结论:随着数字和参数之间映射的加入,这种实现实际上已经变得相当复杂,是否比原来的开关更简单还有待商榷。
如果要在不增加运行时间的情况下减少代码重复量,可以使用if
而不是switch
:
assert(u < 9);
if(u >= 1) t = t + function(0,2,1,0) ; // 1
if(u >= 2) t = t + function(1,2,2,0) ; // 2
if(u >= 3) t = t + function(0,3,3,1) ; // 3
if(u >= 4) t = t + function(1,3,4,1) ; // 4
if(u >= 5) t = t + function(2,3,5,1) ; // 5
if(u >= 4) t = t + function(3,2,4,0) ; // 6
if(u >= 5) t = t + function(4,2,5,0) ; // 7
if(u >= 6) t = t + function(3,3,6,1) ; // 8
if(u >= 7) t = t + function(4,3,7,1) ; // 9
if(u >= 8) t = t + function(5,3,8,1) ; // 10
if(u >= 7) t = t + function(6,2,7,0) ; // 11
if(u >= 8) t = t + function(7,2,8,0) ; // 12
与@nyarlathotep类似,我喜欢使用地图预先保存参数的方法。 通过使用元组和 std::accumulate,可以使代码相当干净。 不需要switch语句,只需调用累加即可汇总所有函数。 如果您想执行总和以外的操作,则易于操作,您可以使用您选择的for_each和函数。 我在下面使用了C++11,但认为这个想法适用于C++03和TR1。
#include <iostream>
#include <map>
#include <list>
#include <tuple>
#include <numeric>
using namespace std;
int function(int a, int b, int c, int d)
{
return 1;
}
typedef tuple<int,int,int,int> ParamType;
int addfunc(int a, ParamType b)
{
return a + function(get<0>(b),get<1>(b),get<2>(b),get<3>(b));
}
int main() {
map<int, list<ParamType>> params;
params[1] = {make_tuple(0,2,1,0)};
params[2] = {make_tuple(0,2,1,0), make_tuple(1,2,2,0)};
// and so on...
// later on when you want to use it
int u = 1;
int t = 0;
t = accumulate(params[u].begin(), params[u].end(), t, addfunc);
return 0;
}
- 如何循环打印顶点结构
- 如何在C++中从两个单独的for循环中添加两个数组
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 正在尝试了解输入验证循环
- std::map<struct,struct>::find 找不到匹配项,但是如果我循环通过 begin() 到 end(),我在那里看到匹配项
- 循环后如何继续阅读
- Ardunio UNO解决了多个重叠的定时器循环
- Eigen如何在容器循环中干净地附加矩阵
- 在某些循环内使用vector.push_back时出现分段错误
- 我正在使用嵌套的while循环来解析具有多行的文本文件,但由于某种原因,它只通过第一行,我不知道为什么
- 为什么我的for循环不能正确获取argv
- 如何声明特征矩阵,然后通过嵌套循环初始化它
- while循环中while循环的时间复杂度是多少
- C++中的高效循环缓冲区,它将被传递给C样式数组函数参数
- 为什么在这个代码结束循环中没有得到结束
- Switch 语句在使用默认案例 c++ 时陷入无限循环
- 在特殊案例功能中展开循环
- 在Googletest中循环测试案例
- 开关内的案例不停地循环,即使我坏了
- 在 c++ 开关案例中引入循环