Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/130.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 测试某个值是否在某个范围内的STL函数?_C++_Stl - Fatal编程技术网

C++ 测试某个值是否在某个范围内的STL函数?

C++ 测试某个值是否在某个范围内的STL函数?,c++,stl,C++,Stl,我有一个函数:bool-inBounds(int-value,int-low,int-high)。是否有一个STL等价物可以做有用的事情(特别是获取不同类型的变量)?我在谷歌上找不到一个,我宁愿重复使用也不愿重写 在C++17中,这样的函数没有直接的等价物,但是对于具有快速相等比较的较小类型,您可以使用: 或者,您可以编写自己的函数来测试: template <typename T> bool IsInBounds(const T& value, const T&am

我有一个函数:
bool-inBounds(int-value,int-low,int-high)
。是否有一个STL等价物可以做有用的事情(特别是获取不同类型的变量)?我在谷歌上找不到一个,我宁愿重复使用也不愿重写

在C++17中,这样的函数没有直接的等价物,但是对于具有快速相等比较的较小类型,您可以使用:

或者,您可以编写自己的函数来测试:

template <typename T>
    bool IsInBounds(const T& value, const T& low, const T& high) {
    return !(value < low) && (value < high);
}

请注意,这完全是根据
操作符定义的,我几乎认为您最好不要尝试使用整个函数执行这样一个看似微不足道的任务,而只是内联行为

大概是这样的:

  1 #include <iostream>
  2 
  3 int main() {
  4     int value = 5;
  5     bool inside = false;
  6     int lower = 0;
  7     int upper = 10;
  8     inside = lower < value && value < upper;
  9     printf("inside: %d", inside);
 10     return 0;
 11 }
1#包括
2.
3 int main(){
4整数值=5;
5布尔内=假;
6整数下限=0;
7整数上限=10;
8内部=较低<值&&值<较高;
9 printf(“内部:%d”,内部);
10返回0;
11 }
如果您有理由不这样简单地编写代码,请让我知道,我可以提供一个更复杂的答案

bool inBounds(int value, int low, int high)
有一个小小的缺点,就是你必须记住哪个参数去哪里。
我不是唯一一个在一段时间后返回代码时完全理性的参数排序令人困惑的人

你可以多走一步,定义

template<typename T>
class Interval
{
public:
    Interval(T lo, T hi) : low(lo), high(hi) {}
    bool contains(T value) const { return low <= value && value < high; }
private:
    T low;
    T high;
};
template<typename T>
Interval<T> interval(T lo, T hi) { return Interval<T>(lo, hi); }
如果一个人处于抽象模式,那么概括以适应不同的包容/排斥组合并不难

当然,这对于您的目的来说可能是过分的。

YMMV等等。

你可以从
std::less
std::more
std::bind
std::compose
中组合一个,但这真是太过分了

Lambda的要容易得多:

[](int-value,int-low,int-high){return!(value

或者,如果低和高在范围内


[low,high](int-value){return!(value

谢谢。我仍在尝试使用模板-这些示例非常受欢迎。包容性下限/排他性上限是故意的吗?@tzaman-我只是假设这就是我的初衷。如果需要不同的边界,我会发布一个更新。@tzaman包含的下限,独占的上限是我现在使用的。我站在更正!让我来修复……你需要修复第8行:<代码> Load <值>上< /C> >在C++中不正确工作。您必须将其拆分为
lower
。我也不同意这应该是内联的。这是一个很好的干净的子例程,使用编译器现在的方式,它几乎肯定会被内联。在我的情况下,这不是关于性能的问题,我只是很难用当前可用的信息来证明这一点。我目前正在使用它来检查4个值的边界,这是一个相当大的
if
语句——如果我将测试封装到函数中,那么阅读起来就容易多了,而且我在排版方面失败的可能性也更小。在我看来,另一个关于STL的回答应该对你有好处。如果没有,请描述您需要什么。我是否可以建议使用
中的
作为一个更简单的名称?
  1 #include <iostream>
  2 
  3 int main() {
  4     int value = 5;
  5     bool inside = false;
  6     int lower = 0;
  7     int upper = 10;
  8     inside = lower < value && value < upper;
  9     printf("inside: %d", inside);
 10     return 0;
 11 }
bool inBounds(int value, int low, int high)
template<typename T>
class Interval
{
public:
    Interval(T lo, T hi) : low(lo), high(hi) {}
    bool contains(T value) const { return low <= value && value < high; }
private:
    T low;
    T high;
};
template<typename T>
Interval<T> interval(T lo, T hi) { return Interval<T>(lo, hi); }
if (interval(a, b).contains(value))
    // ...