【问题标题】:Refactoring repeated range checks which use if statements重构使用 if 语句的重复范围检查
【发布时间】:2018-04-19 01:32:37
【问题描述】:

下面我附上代码,带有逻辑语句。通过查看这段代码,我可以看到它非常重复。

我的任务:给我 9x9 网格,里面有 9 个盒子,我试图让索引开始从 (startRow/Col) 到 (startRow/Col+2) 的循环。

vector<int> findBox(int row, int col){
    int startRow;
    int startCol;
    if(row <= 2){
        startRow = 0;
    } else if(row > 2 && row <= 5){
        startRow = 3;
    } else if(row > 5 && row <= 8){
        startRow = 6;
    }
    if(col <= 2){
        startCol = 0;
    } else if (col > 2 && col <= 5){
        startCol = 3;
    } else if(col > 5 && col <= 8){
        startCol = 6;
    }
    vector<int> v;
    v.push_back(startRow);
    v.push_back(startCol);
    return v;
}

我正在寻找可以更好地解释我的人。还是我应该尝试重构代码并使用 switch?

谢谢。

杰克

【问题讨论】:

  • 我不确定我是否理解 - 您是否得到了 9x9 数组中一系列 9 个连续 cel 需要开始的行和列?您能否重申您要解决的问题,以及为什么要使用向量来返回这两个值?

标签: c++ c++11 if-statement conditional


【解决方案1】:

也许

vector<int> findBox (int row, int col)
 { return { (row - row % 3), (col - col % 3) }; }

?

【讨论】:

  • 这提醒我们,如果您只想返回 2 个值,请使用 std::pair
【解决方案2】:

无需使用开关。利用整数除法将丢弃余数:

int startRow{row / 3 * 3};
int startCol{col / 3 * 3};

然后函数变成:

vector<int> findBox(int row, int col){
    int startRow{row / 3 * 3};
    int startCol{col / 3 * 3};
    vector<int> v;
    v.push_back(startRow);
    v.push_back(startCol);
    return v;
}

【讨论】:

  • 感谢您的快速回复。我将编辑并使用此公式进行计算。
  • 赞成:很高兴看到有人不喜欢用不必要的括号。也很好地依赖 NRVO。
猜你喜欢
  • 2013-01-04
  • 1970-01-01
  • 1970-01-01
  • 2022-07-05
  • 2021-06-08
  • 1970-01-01
  • 1970-01-01
  • 2012-06-09
  • 1970-01-01
相关资源
最近更新 更多