STL函数来测试某个值是否在某个范围内?

sim*_*ont 8 c++ stl

我有一个功能:bool inBounds(int value, int low, int high).是否有一个STL等价物可以做有用的事情(特别是采用不同类型的变量)?我找不到使用谷歌的人,我更愿意重复使用而不是重写.

tem*_*def 11

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

if (val == std::clamp(val, low, high)) {
    ...
}
Run Code Online (Sandbox Code Playgroud)

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

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

这将检查是否value在[低,高]范围内.如果你想要范围[低,高],你可以写为

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

注意这是如何纯粹定义的operator <,这意味着任何支持just的类operator <都可以在这里使用.

同样,这里有一个使用自定义比较器:

template <typename T, typename R, typename Comparator>
    bool IsInBounds(const T& value, const R& low, const R& high, Comparator comp) {
    return !comp(value, low) && comp(value, high);
}
Run Code Online (Sandbox Code Playgroud)

后者具有很好的优点,low并且high不必是相同的类型value,并且只要比较器可以处理它将工作得很好.

希望这可以帮助!


mol*_*ilo 5

bool inBounds(int value, int low, int high)
Run Code Online (Sandbox Code Playgroud)

缺点是您必须记住哪个参数到达哪里。
在一段时间后返回代码时,我不是唯一一个完全合理的参数顺序令人困惑的人。

您可以加倍努力并定义

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); }
Run Code Online (Sandbox Code Playgroud)

然后,您可以更清楚地了解您的意思:

if (interval(a, b).contains(value))
    // ...
Run Code Online (Sandbox Code Playgroud)

如果处于抽象模式,则可以很容易地概括以适应不同的包含/排斥组合。

当然,这对于您的目的而言可能是过大的。
YMMV,等等。