前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >C++17中的std::clamp:限制值的范围

C++17中的std::clamp:限制值的范围

原创
作者头像
码事漫谈
发布于 2025-02-10 11:16:45
发布于 2025-02-10 11:16:45
41800
代码可运行
举报
文章被收录于专栏:C++C++
运行总次数:0
代码可运行
生成动漫图片 (1).png
生成动漫图片 (1).png

在C++17中,std::clamp是一个极为实用的算法,它能够助力我们将一个值限定在指定的范围之内。这一功能在众多场景中都大有用处,像游戏开发、图形处理、数值计算等领域均是如此。本文将全面且详细地介绍std::clamp的定义、用法以及一些实际应用示例。

一、背景与动机

在编程实践里,我们常常需要把某个值约束在一个合理的范围之中。例如,在游戏中,角色的速度不能超越某个上限;或者在图形处理里,图形的透明度必须处于0到1之间。以往,我们通常得手动编写代码来达成这种限制,比如:

代码语言:cpp
代码运行次数:0
运行
AI代码解释
复制
value = std::min(std::max(value, min_value), max_value);

尽管这种方法能够正常工作,但代码显得冗长,而且容易出错。C++17引入了std::clamp,让这种操作变得更加简洁直观。

二、std::clamp的定义

std::clamp是C++17标准库中所定义的一个算法,它位于<algorithm>头文件当中。其定义如下:

代码语言:cpp
代码运行次数:0
运行
AI代码解释
复制
template <class T>
constexpr const T& clamp(const T& v, const T& lo, const T& hi);

该函数的作用是将值v限制在lohi之间。若v小于lo,则返回lo;若v大于hi,则返回hi;否则返回v。需要特别注意的是,lo必须小于或等于hi,不然行为是未定义的。

三、使用示例

示例1:基本用法

代码语言:cpp
代码运行次数:0
运行
AI代码解释
复制
#include <iostream>
#include <algorithm>

int main() {
    int value = 10;
    int min_value = 5;
    int max_value = 15;

    int clamped_value = std::clamp(value, min_value, max_value);
    std::cout << "Clamped value: " << clamped_value << std::endl;

    value = 3;
    clamped_value = std::clamp(value, min_value, max_value);
    std::cout << "Clamped value: " << clamped_value << std::endl;

    value = 20;
    clamped_value = std::clamp(value, min_value, max_value);
    std::cout << "Clamped value: " << clamped_value << std::endl;

    return 0;
}

输出结果:

代码语言:txt
AI代码解释
复制
Clamped value: 10
Clamped value: 5
Clamped value: 15

解释

  • value处于min_valuemax_value之间时,std::clamp返回value
  • value小于min_value时,std::clamp返回min_value
  • value大于max_value时,std::clamp返回max_value

示例2:浮点数和自定义类型

std::clamp不仅适用于整数,对于浮点数和自定义类型(只要这些类型支持比较操作)同样适用。

代码语言:cpp
代码运行次数:0
运行
AI代码解释
复制
#include <iostream>
#include <algorithm>

struct Point {
    int x, y;
    bool operator<(const Point& other) const {
        return x < other.x || (x == other.x && y < other.y);
    }
    bool operator==(const Point& other) const {
        return x == other.x && y == other.y;
    }
};

int main() {
    double value = 3.14;
    double min_value = 0.0;
    double max_value = 1.0;

    double clamped_value = std::clamp(value, min_value, max_value);
    std::cout << "Clamped value: " << clamped_value << std::endl;

    Point p = {5, 5};
    Point min_p = {0, 0};
    Point max_p = {10, 10};

    Point clamped_p = std::clamp(p, min_p, max_p);
    std::cout << "Clamped point: (" << clamped_p.x << ", " << clamped_p.y << ")" << std::endl;

    return 0;
}

输出结果:

代码语言:txt
AI代码解释
复制
Clamped value: 1
Clamped point: (5, 5)

解释

  • 对于浮点数,std::clamp能够正常发挥作用。
  • 对于自定义类型Point,只要定义了比较操作符<==std::clamp就能正确地限制对象的范围。

四、实际应用场景

1. 游戏开发

在游戏中,角色的属性(像速度、血量、魔法值等)通常需要限制在一定范围之内。使用std::clamp可以非常便捷地实现这种限制:

代码语言:cpp
代码运行次数:0
运行
AI代码解释
复制
float speed = 10.0f;
float min_speed = 0.0f;
float max_speed = 5.0f;

speed = std::clamp(speed, min_speed, max_speed);

2. 图形处理

在图形处理中,像素值(例如RGB颜色值)通常需要限制在0到255之间。使用std::clamp可以确保这些值不会超出范围:

代码语言:cpp
代码运行次数:0
运行
AI代码解释
复制
int red = 260;
red = std::clamp(red, 0, 255);

3. 数值计算

在数值计算中,某些变量可能需要限制在合理的范围之内,以避免出现数值不稳定的情况。例如,在计算一个比例时,可以确保其值在0到1之间:

代码语言:cpp
代码运行次数:0
运行
AI代码解释
复制
double ratio = 1.5;
ratio = std::clamp(ratio, 0.0, 1.0);

五、注意事项

  1. 参数顺序std::clamp的参数顺序是valuelohi,必须保证lo <= hi,否则行为未定义。
  2. 类型要求std::clamp要求T类型必须支持比较操作符<==。如果类型不支持这些操作符,编译器会报错。
  3. 性能std::clamp是一个高效的算法,因为它仅涉及简单的比较操作。在对性能有较高要求的应用中,可以放心使用。

六、总结

std::clamp是C++17标准库中一个极为实用的算法,它能够帮助我们将一个值限制在指定的范围之内。通过简洁的语法和高效的实现,std::clamp在游戏开发、图形处理和数值计算等领域都发挥着重要作用。希望本文能帮助你更好地理解和使用std::clamp。如果你有任何问题或建议,欢迎在评论区留言!

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
MySQL添加用户、删除用户与授权
1.新建用户   1.1 登录MYSQL:   @>mysql -u root -p   @>密码   1.2 创建用户:   mysql> CREATE USER 'test'@'%' IDENTIFIED BY '1234';    这样就创建了一个名为:test 密码为:1234 的用户。   注意:此处的"localhost",是指该用户只能在本地登录,不能在另外一台机器上远程登录。如果想远程登录的话,将"localhost"改为"%",表示在任何一台电脑上都可以登录。也可以指定某台机器可以远程登录
磊哥
2018/05/08
3.8K0
mysql建用户和修改密码和忘记密码的解决办法
MySql中添加用户,新建数据库,用户授权,删除用户,修改密码(注意每行后边都跟个;表示一个命令语句结束):
孙杰
2019/10/29
2K0
Mysql 启动命令详解「建议收藏」
如:本机是: C:\Program Files\MySQL\MySQL Server 5.7\bin 在cmd 里切换到此目录,
全栈程序员站长
2022/08/31
3.4K0
Mysql常用必备命令
这篇文章主要介绍了MySQL的常用命令集锦,堪称初学者需要掌握的MYSQL命令大全,其中系统命令行环境是基于类Unix系统来作例子的,需要的朋友可以参考下
用户8449980
2021/07/12
3K0
MySQL用户管理、用户授权与权限及设置远程访问
insert into mysql.user(Host,User,Password) values("localhost","test",password("1234"));
菲宇
2022/12/02
5K0
Mysql关于用户的操作
格式:grant 权限 on 数据库.* to 用户名@登录主机 identified by “密码";
悟空宇
2024/03/11
1260
Mysql关于用户的操作
mysql 授权
mysql授权 一.创建用户: mysql> insert into mysql.user(Host,User,Password) values("localhost","test",password("1234")); 创建用户 mysql> CREATE USER 'test'@'%' IDENTIFIED BY '1234'; 这样就创建了一个名为:test 密码为:1234 的用户。 注意:此处的"localhost",是指该用户只能在本地登录,不能在另外一台机器上远程登录。如果想远程登录的话,将
用户8006012
2022/04/19
2.9K0
centos 7 安装查看并修改密码的命令操作方式
修改密码,注意密码要稍微复杂点(大小写+符号+数字),不然会提示 Your password does not satisfy the current policy requirements
用户9104802
2021/11/22
1K0
mysql 权限相关
MySQL5.7 mysql.user表没有password字段改 authentication_string;
用户2657851
2020/03/04
2.1K0
Mysql相关命令
sc config MySQL binpath= "C:\Program Files\mysql\bin\mysqld MySQL"
阿木木
2023/08/08
2800
mysql---用户和权限管理复习
host:指定该用户在哪个主机上可以登陆,如果是本地用户可用localhost,如果想让该用户可以从任意远程主机登陆,可以使用通配符%,主要有以下几种写法
大忽悠爱学习
2021/11/15
1.8K0
mysql安全权限的讲解
MySQL 默认有个root用户,但是这个用户权限太大,一般只在管理数据库时候才用。如果在项目中要连接 MySQL 数据库,则建议新建一个权限较小的用户来连接。
张哥编程
2024/12/19
1330
MySQL的用户管理
#前言:我们知道,无论是登陆MySQL数据库还是登陆Linux系统,都需要有用户来登陆。默认情况下,root用户是享有最高权限的超级用户,可以使用包括create,drop,insert等操作,但是我们也需要一些普通用户来进行管理,接下来就让我们对号入座,来进行如何创建用户,授权用户,和删除用户等操作
老油条IT记
2020/03/20
2.4K0
Linux下mysql添加用户并授权数据库权限
在 Linux 下,你可以使用 MySQL 的 root 用户登录到 MySQL 数据库,然后通过 SQL 命令来添加新用户并授予数据库权限。以下是一个简单的步骤:
正在走向自律
2024/12/17
5090
MySQL远程连接、用户授权
mysql> insert into mysql.user(Host,User,Password) values("localhost","test",password("1234"));
HammerZe
2022/05/09
5.7K0
Ubuntu 下mysql常用操作
1:打开mysql数据库 mysql -h主机地址 -u用户名 -p用户密码 mysql -h110.110.110.110 -uroot -pabcd123 命令mysql -uroot -p 2:更改密码 格式:mysqladmin -u用户名 -p旧密码 password 新密码 mysqladmin -uroot -password ab12 mysqladmin -uroot -pab12 password djg345 3:增加用户 格式:grant select on 数据库.* to 用
闵开慧
2018/03/30
1.2K0
CentOS 6/7 下MySQL 8.0 安装部署与配置
一、前言 1、本教程适用范围 软件 版本 CentOS CentOS 6 & CentOS 7 MySQL 8.0.x 2、本篇环境信息 软件 版本 CentOS 7.4 Release MySQL 8.0.11 二、安装 1、添加包 #CentOS 7 cd /home/downloads wget https://dev.mysql.com/get/mysql80-community-release-el7-1.noarch.rpm sudo rpm -ivh mysql80-community-r
KenTalk
2018/09/11
2.7K0
MySQL5.6安装&修改root密码&创建一定权限用户
1. 压缩版MySQL,解压完后在:我的电脑->属性->高级->环境变量 选择PATH,在其后面添加mysql bin文件夹的路径 (如:C:\Program Files\MySQL\MySQL Server 5.6\bin ) 2. 在my-default.ini修改或添加配置: [mysqld] basedir=C:\Program Files\MySQL\MySQL Server 5.6(mysql所在目录) datadir=C:\Program Files\MySQL\MySQL Server 5.6\data (mysql所在目录\data) port = 3306 3. 以管理员身份运行cmd,输入mysqld -install 4. 安装成功后就要启动服务了,继续在cmd中输入:net start mysql(如图),服务启动成功! 5. 服务启动成功之后,就可以登录了,如图,输入mysql -u root -p(第一次登录没有密码,直接按回车过),登录成功!
奋飛
2019/08/15
3.9K0
MySQL权限管理 原
·  管理权限(如 super, process, file等)不能够指定某个数据库,on后面必须跟 *.*
拓荒者
2019/03/11
2.2K0
MySQL数据库远程连接、创建新用户、设置权限
上篇文章我们写了在服务器上安装MySQL,可以随时远程连接,我们这次讲如何创建一个新的用户,给予权限,并且实现远程连接!
浩Coding
2019/07/02
9.4K0
MySQL数据库远程连接、创建新用户、设置权限
相关推荐
MySQL添加用户、删除用户与授权
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档