Qt工作总结07 <qBound和std::clamp>

一、qBound简介

1. 定义

  • 是 Qt 框架中一个非常实用的边界限制函数(也称为 "clamp" 函数),用于将一个值限制在指定的最小值和最大值之间。
  • 头文件:#include <QtGlobal>

2. 函数原型

template <typename T>
const T &qBound(const T &min, const T &value, const T &max);

3. 作用

  • 确保返回值始终满足:min ≤ result ≤ max

4. 行为准则

  • 如果value < min,返回 min;
  • ​​​​​如果value > max,返回 max;
  • 如果 min < value < max,返回 value;

5. 等效代码

template <typename T>
const T &qBound(const T &min, const T &val, const T &max) {
    if (val < min)
        return min;
    if (val > max)
        return max;
    return val;
}

6. 使用示例

#include <QtGlobal>
#include <QDebug>

int main() {
    // 整数边界限制
    int val1 = qBound(0, -5, 100);   // 返回 0 (小于最小值)
    int val2 = qBound(0, 50, 100);   // 返回 50 (在范围内)
    int val3 = qBound(0, 150, 100);  // 返回 100 (大于最大值)

    // 浮点数边界限制
    double dval = qBound(0.0, -1.5, 1.0);  // 返回 0.0

    // 颜色分量限制 (0-255)
    int red = qBound(0, 300, 255);  // 返回 255

    qDebug() << val1 << val2 << val3;  // 输出: 0 50 100
    qDebug() << dval;                 // 输出: 0
    qDebug() << red;                  // 输出: 255
    
    return 0;
}

7. 注意事项

  • 参数顺序:

        必须确保 min <= max,如果min > max,结果未定义(可能返回错值);

  • 安全用法:
qBound(std::min(a,b),value,std::max(a,b));
  • 返回值类型: 

        返回的是 const T& 引用:

        避免返回临时对象的引用,当参数是临时对象时可能有问题,如下示例;

int bad = qBound(0, 50, 100) + 10; 

二、std::clamp(C++17)

1. 定义

  • C++17标准库中引入的函数模板,用于将值限制在指定范围内。

2. 函数原型

template <typename T>
const T& clamp(const T& value, const T& low, const T& high);

3. 用法

#include <algorithm>
int val = std::clamp(rawValue, minValue, maxValue);

4. 行为准则

  • 如果 value < low,返回low;
  • 如果value > high,返回high;
  • 否则返回 value;

5. 前提条件

  • 必须满足 low <= high,否则行为未定义;

6. 使用示例

#include <algorithm>
#include <iostream>

int main() {
    int val = 150;
    
    // 将值限制在 0-100 范围内
    int clamped = std::clamp(val, 0, 100);
    
    std::cout << "Original: " << val      // 输出 150
              << "\nClamped: " << clamped // 输出 100
              << std::endl;
}

三、区别对比

1. 边界处理

  • qBound()  :边界可能无效
  • std::clamp :已知边界有效

2. 参数顺序

// 助记:std::clamp 是 "值-低-高",qBound 是 "低-值-高"
auto cpp = std::clamp(VALUE, LOW, HIGH);
auto qt = qBound(LOW, VALUE, HIGH);
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值