如何简化检查一对数字是(1,2)还是(2,1)?
Posted
技术标签:
【中文标题】如何简化检查一对数字是(1,2)还是(2,1)?【英文标题】:How to simplify checking if a pair of numbers is (1,2) or (2,1)? 【发布时间】:2021-03-18 09:50:49 【问题描述】:我需要确保一对数字是 (1, 2) 或 (2, 1)。 x 和 y 始终为正。我现在使用的代码:
if ((x == 2 && y == 1) ||
(x == 1 && y == 2))
return 1;
看起来有点笨重,感觉可以简化一下。然而,我尝试的一切都导致了误报。
【问题讨论】:
您可以将它们相乘,结果是 2 还是不是 2。这会以牺牲其他一切为代价将源代码大小减少几个字符。只需使用易于理解、易于调试的即可。 @MartinJames 公平地说,我认为 OP 要求的是更简单的代码,而不是代码打高尔夫球的解决方案。此外,-1
和 -2
的解决方案将失败。
@cigien umm...'x 和 y 都是正数'
@MartinJames 哦,好点,我错过了:p 你可以写一个解决方案,虽然它可能不那么容易阅读。
@cigien '你可以写一个解决方案' 不,谢谢 - 如果你愿意,请随时发布:) 我更看重清晰,易于调试,而不是“聪明”的技巧:)
【参考方案1】:
这是进行这种比较的最直接的方法。
它也比您想出的任何替代方案都更具可读性,因此无需更改。
【讨论】:
我对这个答案投了反对票,因为它在没有任何证据的情况下提出了强有力的主张。无法想象一个更简单或更易读的解决方案并不是真正的答案。【参考方案2】:这是我认为更具可读性的一种编写方式:
if (std::setx,y == std::set1,2)
return 1;
请注意,这不如您问题中的版本有效。例如,不要在您将作为库发布的代码中编写此代码。但是,当性能不是问题时,在您自己的程序中编写是完全合理的。
这是demo。
【讨论】:
这是一段非常昂贵的代码。这个答案真的应该被贴上“开玩笑”的标签。 @PeteBecker 这很昂贵,但 OP 并未表示性能是他们关心的问题。而且我根本不是在开玩笑,我确实认为这是可读的代码,它更清楚地表达了“检查两件事是否是 1 和 2”的意图。我已经编辑了答案以澄清。 @cigien — 说话像一个真正的 Python 程序员。我能看到你简化它的唯一方法是有一个结构来代表你 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;
【讨论】:
这可能在 Python ((x, y) in (1, 2), (2, 1)
) 等语言中有所改进,但在 C++ 中,这太冗长了,没有什么好处。
我认为这取决于,作为一名游戏程序员,我更喜欢将vector
作为一个整体结构进行比较,而不是对每个组件进行比较。当然,在这种情况下,我不会使用std::pair
,而是使用vector2d
。
作为另一个游戏程序员,我更喜欢它所写的,因为我们没有得到其他上下文。如果它已经是向量或其他类型,那么比较这种方式就可以了,但如果不是,我认为没有必要将它强制转换为它不是的东西。您的示例也不完整,因为它实际上并未将值放入 valuePair
。
我会注意到我没有投反对票。我只是就你为什么会这样发表意见。但是,如果你已经有预定义的对,直接比较它们比“解构”它们并比较它们更干净。不过,我不确定如果你从碎片开始会更干净。
@Carcigenicate 是的,同意,这取决于上下文。 :) 这就是我放的原因,If this is some kind of coordinate
【参考方案4】:
值可以为 0 吗?有人说 0 不是正数或负数。
如果 X 和 Y 都 > 0,那么如何:
if( 3 == (x + y) ) return 1;
【讨论】:
【参考方案5】:你可以(ab)使用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;
【讨论】:
这在各个方面都不太可读。我看不出任何优势。 @CodyGray:我期待std::minmax(x, y) == 1, 2
,但类型不匹配。以上是关于如何简化检查一对数字是(1,2)还是(2,1)?的主要内容,如果未能解决你的问题,请参考以下文章