如何简化检查一对数字是 (1,2) 还是 (2,1)?
How to simplify checking if a pair of numbers is (1,2) or (2,1)?
我需要确保一对数字是 (1, 2) 或 (2, 1)。 x 和 y 始终为正。我现在使用的代码:
if ((x == 2 && y == 1) ||
(x == 1 && y == 2)) {
return 1;
}
看起来有点笨重,感觉可以简化一下。然而,我尝试的一切都导致了误报。
这是最直接的比较方式。
它也比您可能想出的任何替代方案都更具可读性,因此无需更改它。
我能看到你简化它的唯一方法是用一个结构来代表你 x
和 y
,如果这是某种坐标,你可以使用类似 vector2d
或 std::pair<int, int>
那么你可以这样做:
std::pair<int, int> valuePair = std::make_pair(x, y);
if (valuePair == std::make_pair(1, 2) || valuePair == std::make_pair(2, 1))
{
return 1;
}
下面是一种我认为更具可读性的写法:
if (std::set{x,y} == std::set{1,2})
{
return 1;
}
请注意,这不如您问题中的版本有效。例如,不要在要作为库发布的代码中编写此代码。但是,当性能不是问题时,在您自己的程序中编写是完全合理的。
这里是 demo。
值可以为0吗?有人说0不是正数也不是负数。
如果 X 和 Y 都 > 0,那么:
if( 3 == (x + y) ) { return 1; }
您可能会(滥用)使用 std::minmax
:
if (std::minmax(x, y) == std::pair<const int&, const int&>{1, 2})
{
return 1;
}
或
if (std::minmax(x, y) == std::minmax(1, 2))
{
return 1;
}
或 (C++17)
if (auto [a, b] = std::minmax(x, y); a == 1 && b == 2)
{
return 1;
}
我需要确保一对数字是 (1, 2) 或 (2, 1)。 x 和 y 始终为正。我现在使用的代码:
if ((x == 2 && y == 1) ||
(x == 1 && y == 2)) {
return 1;
}
看起来有点笨重,感觉可以简化一下。然而,我尝试的一切都导致了误报。
这是最直接的比较方式。
它也比您可能想出的任何替代方案都更具可读性,因此无需更改它。
我能看到你简化它的唯一方法是用一个结构来代表你 x
和 y
,如果这是某种坐标,你可以使用类似 vector2d
或 std::pair<int, int>
那么你可以这样做:
std::pair<int, int> valuePair = std::make_pair(x, y);
if (valuePair == std::make_pair(1, 2) || valuePair == std::make_pair(2, 1))
{
return 1;
}
下面是一种我认为更具可读性的写法:
if (std::set{x,y} == std::set{1,2})
{
return 1;
}
请注意,这不如您问题中的版本有效。例如,不要在要作为库发布的代码中编写此代码。但是,当性能不是问题时,在您自己的程序中编写是完全合理的。
这里是 demo。
值可以为0吗?有人说0不是正数也不是负数。
如果 X 和 Y 都 > 0,那么:
if( 3 == (x + y) ) { return 1; }
您可能会(滥用)使用 std::minmax
:
if (std::minmax(x, y) == std::pair<const int&, const int&>{1, 2})
{
return 1;
}
或
if (std::minmax(x, y) == std::minmax(1, 2))
{
return 1;
}
或 (C++17)
if (auto [a, b] = std::minmax(x, y); a == 1 && b == 2)
{
return 1;
}