多个' if ... else ...' c ++中的一行语句

时间:2015-12-08 16:47:28

标签: c++ if-statement

如果我想将这段代码放到一行怎么办?

if (count >= 0 && count <= 199) {
        return 1;
    } else if (count >= 200 && count <= 399) {
        return 2;
    } else if (count >= 400 && count <= 599) {
        return 3;
    } else if (count >= 600 && count <= 799) {
        return 4;
    } else {
        return 5;
    }

我只是想知道这几行代码是否有任何捷径。

3 个答案:

答案 0 :(得分:6)

return ( count >= 0 && count <= 799 ) ? (1 + count / 200) : 5;

即:如果count在范围内,则返回每个范围200的连续值,如果超出范围,则返回5.

答案 1 :(得分:1)

如果无法直接从计数中计算范围,如Scott Hunter的答案所示(例如,如果范围大小不均匀或者它们映射的值不形成简单模式),则可以封装像这样的小桌面查找:

#include <algorithm>
#include <utility>
#include <vector>

int FindRange(int count) {
  static const std::pair<int, int> ranges[] = {
    {   0, 5 },
    { 200, 1 },
    { 400, 2 },
    { 600, 3 },
    { 800, 4 }
  };
  const auto it = std::find_if(std::begin(ranges), std::end(ranges),
                               [=](const std::pair<const int, int> &range) {
                                 return count < range.first;
                               });
  return (it == std::end(ranges)) ? ranges[0].second : it->second;
}

然后您可以更改表值,只要您对它们进行排序,此功能将继续有效。

这是对表格的线性搜索,因此它应与级联if-else的性能相媲美。

答案 2 :(得分:0)

return 1 + std::min(count, 800) / 200;

应该可以。 if 隐藏在 std::min 中。如果 count 大于 800,则替换为 800,std::min(count, 800) / 200 等于 4。