zoukankan      html  css  js  c++  java
  • numeric_limits 模板的相关知识点

         说白了,它是一个模板类,它主要是把C++当中的一些内建型别进行了封装,比如说numeric_limits<int>是一个特化后的类,从这个类的成员变量与成员函数中,我们可以了解到int的很多特性:可以表示的最大值,最小值,是否是精确的,是否是有符号等等。如果用其他任意(非内建类型)来特化这个模板类,比如string,string怎么可能有最大值?我们从MSDN上可以了解到,这对string,成员变量与成员函数是没有意义的,要么返回0要么为false。

    具体的一些用法:

    #include <limits>
    #include <iostream>
    using namespace std;

    int main() {
    cout << boolalpha;

    cout << "max(short): " << numeric_limits<short>::max() << endl;
    cout << "min(short): " << numeric_limits<short>::min() << endl;

    cout << "max(int): " << numeric_limits<int>::max() << endl;
    cout << "min(int): " << numeric_limits<int>::min() << endl;

    cout << "max(long): " << numeric_limits<long>::max() << endl;
    cout << "min(long): " << numeric_limits<long>::min() << endl;

    cout << endl;

    cout << "max(float): " << numeric_limits<float>::max() << endl;
    cout << "min(float): " << numeric_limits<float>::min() << endl;

    cout << "max(double): " << numeric_limits<double>::max() << endl;
    cout << "min(double): " << numeric_limits<double>::min() << endl;

    cout << "max(long double): " << numeric_limits<long double>::max() << endl;
    cout << "min(long double): " << numeric_limits<long double>::min() << endl;

    cout << endl;

    cout << "is_signed(char): "
    << numeric_limits<char>::is_signed << endl;
    cout << "is_specialized(string): "
    << numeric_limits<string>::is_specialized << endl;
    }

    运行结果:

    max(short): 32767
    min(short): -32768
    max(int): 2147483647
    min(int): -2147483648
    max(long): 2147483647
    min(long): -2147483648

    max(float): 3.40282e+038
    min(float): 1.17549e-038
    max(double): 1.79769e+308
    min(double): 2.22507e-308
    max(long double): 1.79769e+308
    min(long double): 2.22507e-308

    is_signed(char): true
    is_specialized(string): false
    请按任意键继续. . .

    关于为什么float的最小值竟然是正的?我也存在疑问,从结果中,我们看出,min返回的是float型别可以表示的最小的正值,

    而不是最小的float数。

    从这个例子中,我们差不多了解到numeric_limits的基本用法。

    3. 基本成员函数

    我以float类型来展示:

    #include <limits>
    #include <iostream>
    using namespace std;

    int main() {
    cout << boolalpha;
    // 可以表示的最大值
    cout << "max(float): " << numeric_limits<float>::max() << endl;
    // 可以表示的大于0的最小值,其他类型的实现或与此不同
    cout << "min(float): " << numeric_limits<float>::min() << endl;
    // 标准库是否为其实现了特化
    cout << "is_specialized(float): " << numeric_limits<float>::is_specialized << endl;
    // 是否是有符号的,即可以表示正负值
    cout << "is_signed(float): " << numeric_limits<float>::is_signed << endl;
    // 不否是整形的
    cout << "is_integer(float): " << numeric_limits<float>::is_integer << endl;
    // 是否是精确表示的
    cout << "is_exact(float): " << numeric_limits<float>::is_exact << endl;
    // 是否存在大小界限
    cout << "is_bounded(float): " << numeric_limits<float>::is_bounded << endl;
    // 两个比较大的数相加而不会溢出,生成一个较小的值
    cout << "is_modulo(float): " << numeric_limits<float>::is_modulo << endl;
    // 是否符合某某标准
    cout << "is_iec559(float): " << numeric_limits<float>::is_iec559 << endl;
    // 不加+-号可以表示的位数
    cout << "digits(float): " << numeric_limits<float>::digits << endl;
    // 十进制数的个数
    cout << "digits10(float): " << numeric_limits<float>::digits10 << endl;
    // 一般基数为2
    cout << "radix(float): " << numeric_limits<float>::radix << endl;
    // 以2为基数的最小指数
    cout << "min_exponent(float): " << numeric_limits<float>::min_exponent << endl;
    // 以2为基数的最大指数
    cout << "max_exponent(float): " << numeric_limits<float>::max_exponent << endl;
    // 以10为基数的最小指数
    cout << "min_exponent10(float): " << numeric_limits<float>::min_exponent10 << endl;
    // 以10为基数的最大指数
    cout << "max_exponent10(float): " << numeric_limits<float>::max_exponent10 << endl;
    // 1值和最接近1值的差距
    cout << "epsilon(float): " << numeric_limits<float>::epsilon() << endl;
    // 舍入方式
    cout << "round_style(float): " << numeric_limits<float>::round_style << endl;
    }

    运行结果:

    max(float): 3.40282e+038
    min(float): 1.17549e-038
    is_specialized(float): true
    is_signed(float): true
    is_integer(float): false
    is_exact(float): false
    is_bounded(float): true
    is_modulo(float): false
    is_iec559(float): true
    digits(float): 24
    digits10(float): 6
    radix(float): 2
    min_exponent(float): -125
    max_exponent(float): 128
    min_exponent10(float): -37
    max_exponent10(float): 38
    epsilon(float): 1.19209e-007
    round_style(float): 1
    请按任意键继续. . .

    Vector用于存储对象数组

    常用方法

    1.push_back   在数组的最后添加一个数据

    2.pop_back    去掉数组的最后一个数据

    3.at                得到编号位置的数据

    4.begin           得到数组头的指针

    5.end             得到数组的最后一个单元+1的指针

    6.front        得到数组头的引用

    7.back            得到数组的最后一个单元的引用

    8.max_size     得到vector最大可以是多大

    9.capacity       当前vector分配的大小

    10.size           当前使用数据的大小

    11.resize         改变当前使用数据的大小,如果它比当前使用的大,者填充默认值

    12.reserve      改变当前vecotr所分配空间的大小

    13.erase         删除指针指向的数据项

    14.clear          清空当前的vector

    15.rbegin        将vector反转后的开始指针返回(其实就是原来的end-1)

    16.rend          将vector反转构的结束指针返回(其实就是原来的begin-1)

    17.empty        判断vector是否为空

    18.swap         与另一个vector交换数据

  • 相关阅读:
    游戏开发中——垂直同步、绘制效率、显示器刷新频率与帧率
    python 异常
    python 多文件知识
    python if,for,while
    python 算术运算
    1.英语单词笔记
    Java import的作用
    java基础点
    Eclipse Java注释模板设置详解
    Java文档注释详解
  • 原文地址:https://www.cnblogs.com/hoojjack/p/3847387.html
Copyright © 2011-2022 走看看