【发布时间】:2017-04-28 16:59:16
【问题描述】:
现在我有那个代码:
if (minimizator_weighted) {
while (dataFile >> t >> e >> sigma) { // read data file value by value
/* some code */
}
}
else {
while (dataFile >> t >> e) { // all the same but will not read standard deviation
/* almost the same code */
}
}
您可以看到if 和else 流之间的唯一区别是while 循环的条件。我想知道是否有可能优化该 sn-p 并重用代码?如果我能写一些就太好了:
while ((minimizator_weighted) ? (dataFile >> t >> e >> sigma) : (dataFile >> t >> e)) { ... }
但我不确定这个技巧是否正确......你能告诉我一些优化吗?谢谢!
编辑 这是完整的代码sn-p
if (minimizator_weighted) {
while (dataFile >> t >> e >> sigma) { // read data file value by value
data_set::pt point;
point.t = t;
point.e = e;
point.c_vis = 0.0;
point.c_invis = 0.0;
if (std::abs(sigma) <= GSL_SQRT_DBL_MIN) // check for division-by-zero error
sigma = 1.0;
point.sigma = sigma;
set.curve.push_back(point); // store point
data_numPoints++; // collect some stats
set.curveAvg += e;
}
}
else {
while (dataFile >> t >> e) { // all the same but will not read standard deviation
data_set::pt point;
point.t = t;
point.e = e;
point.c_vis = 0.0;
point.c_invis = 0.0;
set.curve.push_back(point);
data_numPoints++;
set.curveAvg += e;
}
}
【问题讨论】:
-
您要求我们判断您是否可以使用“一些代码”代替“几乎相同的代码”。由于我们还没有看到这两个块中的代码,我可以自信地说没有人能够为您提供一个好的答案。
-
是文件中的 sigma 值吗?如果是这样,您将不得不阅读并有条件地忽略它。
-
@RichardHodges 没有。在第一种情况下(加权)数据文件由每行 3 个
double值的行组成。在第二种情况下(未加权)数据文件由每行有 2 个double值的行组成。你可以看到我在阅读这些文件时没有忽略 -
不,此代码不应合并。我建议因为只有
data_set::pt的minimizator_weighted版本使用sigma,所以您创建2 个对象,一个带有sigma成员,一个没有。为每个编写提取运算符,然后模板化此循环所在的函数,并模板化set.curve,从而正确地简化循环。 -
@JonathanMee 我可以编辑循环体并添加额外的
if-statement 来跟踪加权和未加权案例。如果我们正在处理加权案例,我将存储 sigma 值。在其他情况下,我将简单地忽略 sigma 值(就像我的其他代码一样)
标签: c++ while-loop conditional