检查整数是否仅使用<操作者

时间:2010-10-18 22:43:37

标签: c++ comparison-operators

我需要提出一些代码来检查给定的整数是否在范围的范围内。 (范围由一对整数表示。)

因此,如果范围r定义为std::pair<int, int>,测试整数n,我想说:

if (n >= r.first && n <= r.second)

问题是,我需要使用std::less<int>比较仿函数来执行此操作,这意味着我只能使用小于运算符。

我正在努力想出相同的表达方式。我很确定我说得对,但我并不完全自信。

我想出的表达是:

( !cmp(n, r.first) && !cmp(r.second, n) )

其中cmpstd::less<int>

的实例

我做得对吗?

3 个答案:

答案 0 :(得分:7)

轮询他人并不是验证正确性的最佳方法。 :)

相反,请考虑您的问题。您正在处理的所有内容都是int,因此所涉及的所有值都可以表示为int。不涉及加法或减法,因此您不必担心离开可表示的范围。因此,我们可以使用标准整数回退到标准数学,并留下机器表示的混乱。

您将获得两端[n, m]和值p关闭的范围,以测试该范围内的成员资格。您有一个可以使用的整数运算符<。所有标准布尔运算符都是合理的游戏。

现在,你可以简单地想一下套装。您要拒绝pp < n的所有p > mp的所有其他值均可接受。换句话说,如果

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