我需要提出一些代码来检查给定的整数是否在范围的范围内。 (范围由一对整数表示。)
因此,如果范围r
定义为std::pair<int, int>
,测试整数n
,我想说:
if (n >= r.first && n <= r.second)
问题是,我需要使用std::less<int>
比较仿函数来执行此操作,这意味着我只能使用小于运算符。
我正在努力想出相同的表达方式。我很确定我说得对,但我并不完全自信。
我想出的表达是:
( !cmp(n, r.first) && !cmp(r.second, n) )
其中cmp
是std::less<int>
我做得对吗?
答案 0 :(得分:7)
轮询他人并不是验证正确性的最佳方法。 :)
相反,请考虑您的问题。您正在处理的所有内容都是int
,因此所涉及的所有值都可以表示为int
。不涉及加法或减法,因此您不必担心离开可表示的范围。因此,我们可以使用标准整数回退到标准数学,并留下机器表示的混乱。
您将获得两端[n, m]
和值p
关闭的范围,以测试该范围内的成员资格。您有一个可以使用的整数运算符<
。所有标准布尔运算符都是合理的游戏。
现在,你可以简单地想一下套装。您要拒绝p
或p < n
的所有p > m
。 p
的所有其他值均可接受。换句话说,如果
p
是所需集合的一部分
not ((p < n) or (m < p))
使用DeMorgan定律,这相当于
(not (p < n)) and (not (m < p))
表示使用标准C ++运算符(而不是<iso646.h>
提供的替代拼写),我们得到您的建议,但使用不同的名称:
!<(p, n) && !<(m, p)
将<()
重命名为cmp()
,将n
重命名为r.first
,将m
重命名为r.second
,将p
重命名为{{1}我们准确地得到了你的建议:
n
所以,是的,看起来对我来说是正确的。
答案 1 :(得分:2)
是的,实际上在许多较旧的编程语言<=
实际上被称为ngt
且不大于和&gt; =是{{} 1}}
答案 2 :(得分:1)
简答:
if (num < max && !(num <= min)) { // stuff to do }
如果“num”介于“min”和“max”之间但是不等于它们中的任何一个,则返回true。
如果您需要在范围检查中包含“min”和“max”,请使用:
if (num <= max && !(num < min)) { // stuff to do }
这是因为......
!(A > B) == (A <= B) // If not greater than B, must be less than or equal to B
!(A >= B) == (A < B) // If not greater or equal to B, must be less than B
!(A < B) == (A >= B) // If not less than B, must be greater or equal to B
!(A <= B) == (A > B) // If not less than or equal to B, must be greater than B