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>
我做得对吗?
轮询他人不是验证正确性的最佳方法.:)
相反,请考虑您的问题.您正在处理的所有内容都是一个int,因此所涉及的所有值都可以表示为int.不涉及加法或减法,因此您不必担心离开可表示的范围.因此,我们可以使用标准整数回退到标准数学,并留下机器表示的混乱.
您将获得两端关闭的范围[n, m]以及p测试该范围内成员资格的值.你有一个可以使用的整数运算符<.所有标准布尔运算符都是公平游戏.
现在,你可以简单地思考集合.你想拒绝所有p这样的p < n或p > 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.second和pto n,我们正是您提出的建议:
!cmp(n, r.first) && !cmp(r.second, n)
Run Code Online (Sandbox Code Playgroud)
所以,是的,看起来对我来说是正确的.
| 归档时间: |
|
| 查看次数: |
26849 次 |
| 最近记录: |