仅使用<运算符检查整数是否在范围内

Cha*_*l72 4 c++ comparison-operators

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

因此,给定一个r定义为a std::pair<int, int>和测试整数的范围n,我想说:

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

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

我想提出相同的表达方式.我很确定我说得对,但我并不完全自信.

我想出的表达是:

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

在哪里cmp是一个实例std::less<int>

我做得对吗?

Jer*_*man 8

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

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

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

现在,你可以简单地思考集合.你想拒绝所有p这样的p < np > m.所有其他值p都是可以接受的.换句话说,p是所需的集合if的一部分

not ((p < n) or (m < p))
Run Code Online (Sandbox Code Playgroud)

使用DeMorgan的定律,这相当于

(not (p < n)) and (not (m < p))
Run Code Online (Sandbox Code Playgroud)

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

!<(p, n) && !<(m, p)
Run Code Online (Sandbox Code Playgroud)

重命名<()cmp(),nto r.first,mto r.secondpto n,我们正是您提出的建议:

!cmp(n, r.first) && !cmp(r.second, n)
Run Code Online (Sandbox Code Playgroud)

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