当前位置: 首页 > news >正文

C++STL---<limits>

一、核心模板类 numeric_limits<T>

用于查询算术类型属性,需特化类型 T(如 int, float)后使用。

#include <limits>
using namespace std;

二、常用静态成员函数(需通过 :: 调用)

成员函数作用描述示例(int类型)
min()类型最小值numeric_limits<int>::min() → -2147483648
max()类型最大值numeric_limits<int>::max() → 2147483647
epsilon()浮点类型精度(1与最小>1值的差)numeric_limits<float>::epsilon() ≈ 1.192e-07
digits类型的有效位数(不含符号位)numeric_limits<char>::digits → 7
is_signed类型是否带符号numeric_limits<unsigned>::is_signed → false
is_integer是否为整数类型numeric_limits<double>::is_integer → false

三、特殊值检测(浮点类型专用)

numeric_limits<float>::has_infinity;   // 是否支持无穷大
numeric_limits<float>::infinity();     // 正无穷值
numeric_limits<float>::quiet_NaN();    // 非信号NaN(Not a Number)

示例

// 检查float类型是否支持无穷大表示
static const bool has_infinity = numeric_limits<float>::has_infinity; 

// 获取正无穷大值
float inf = numeric_limits<float>::infinity();  

// 获取非信号NaN(安静型非数)
float nan = numeric_limits<float>::quiet_NaN();  


四、底层特性与平台适配

numeric_limits<int>::is_modulo;  // 溢出是否取模(如无符号类型为true)
numeric_limits<char>::is_iec559; // 是否符合IEEE 754标准(仅浮点)
numeric_limits<double>::round_style; // 舍入方式(如round_to_nearest)

应用代码示例

// 检查int类型溢出是否取模运算
const bool int_modulo = numeric_limits<int>::is_modulo; 

// 典型应用场景
template<typename T>
T safe_increment(T val) {
    if (numeric_limits<T>::is_modulo) {
        return val + 1; // 安全操作
    } else {
        if (val < numeric_limits<T>::max()) 
            return val + 1;
        throw overflow_error("Exceeded maximum value");
    }
}

// 获取当前浮点环境的舍入方式
const float_round_style style = numeric_limits<double>::round_style;

// 根据舍入模式选择算法
if (style == round_to_nearest) {
    // 使用统计友好的算法
} else if (style == round_toward_zero) {
    // 财务计算首选模式
}


五、与C风格宏的对比优势

对比C语言的 <climits><cfloat>

  • 类型安全:避免宏的类型错误(如 INT_MAX 误用于 long
  • 泛型友好:模板代码中可统一接口
  • 扩展性:支持用户自定义类型的特化

六、实际应用场景

  1. 防止数值溢出

    template<typename T>
    T safe_add(T a, T b) {
        if (a > numeric_limits<T>::max() - b) 
            throw overflow_error("Addition overflow");
        return a + b;
    }
    
  2. 浮点数判等(考虑精度)

    bool almost_equal(double a, double b) {
        return abs(a - b) < numeric_limits<double>::epsilon();
    }
    
  3. 动态类型特性检查

    template<typename T>
    void print_range() {
        if constexpr (numeric_limits<T>::is_signed) {
            cout << "Range: [" << numeric_limits<T>::min() << ", "
                 << numeric_limits<T>::max() << "]\n";
        }
    }
    

七、扩展:自定义类型特化(示例)

class MyCustomType { /*...*/ };

namespace std {
template<>
class numeric_limits<MyCustomType> {
public:
    static constexpr bool is_specialized = true;
    static MyCustomType max() { return MyCustomType(100); }
    // 定义其他必要成员...
};
}

八、注意事项

  • 非算术类型(如类/字符串)默认无特化版本
  • 编译时常量:所有成员均为 constexpr,可用于模板元编程
  • C++11后新增 lowest() 函数,返回类型最小有限值(对浮点类型更准确)

你没有走错路,你是在等待风的到来。 —伊吹有喜

相关文章:

  • 【Linux网络-HTTP协议】HTTP基础概念+构建HTTP
  • MySQL中like模糊查询如何优化?
  • 2025AI 有哪些重要的发展趋势?
  • Centos7部署k8s(单master节点安装)
  • 协议-Airkiss
  • LINUX网络基础 - 初识网络,理解网络协议
  • 一、Redis 通用命令大全
  • SoapUI 结合 Postman 测试 WebService 协议
  • 一个py文件搞定mysql查询+Json转换+表数据提取+根据数据条件生成excel文件+打包运行一条龙
  • AI日记app
  • 前端文件分片上传深度解析:从原理到实践
  • leetcode日记(74)扰乱字符串
  • 记录一次跨库连表的坑
  • Java中用Map<String,Object>存储层次结构
  • 数据结构(初阶)(五)----栈
  • 解决下载支持gpu的pytorch问题
  • 云原生网络篇——万级节点服务网格与智能流量治理
  • [密码学实战]Java生成SM2根证书及用户证书
  • 【零基础C语言】第四节 数组
  • 系统架构设计师—计算机基础篇—计算机网络
  • 阳光保险拟设立私募证券投资基金,总规模200亿元
  • 世界数字教育大会发布“数字教育研究全球十大热点”
  • 戛纳打破“疑罪从无”惯例,一法国男演员被拒之门外
  • 网易有道一季度净利润同比增长247%:有能力在今年实现更强劲的利润增长
  • 陕西三原高新区违法占用土地,被自然资源局罚款10万元
  • 一船明月过沧州:为何这座城敢称“文武双全”?