4

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

所以,给定一个范围r定义为a 的范围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>

我做对了吗?

4

3 回答 3

8

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

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

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

现在,您可以简单地考虑集合。你想拒绝所有p这样的p < nor p > m。的所有其他值p都是可接受的。换句话说,p如果是所需集合的一部分

not ((p < n) or (m < p))

使用德摩根定律,这相当于

(not (p < n)) and (not (m < p))

表示使用标准 C++ 运算符(而不是 提供的替代拼写<iso646.h>),我们得到您建议的内容,但使用不同的名称:

!<(p, n) && !<(m, p)

重命名<()cmp()nto r.firstmtor.secondpto n,我们得到的正是您所建议的:

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

所以,是的,对我来说看起来是正确的。

于 2010-10-18T23:05:09.830 回答
2

简短的回答:

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
于 2010-10-18T23:09:30.473 回答
2

是的,不小于等于等于大于等于,其实在很多老的编程语言<=中其实都叫ngt不大于和>=是nlt

于 2010-10-18T22:46:49.337 回答