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交换数据

  • 相关阅读:
    POJ 1300 Open Door
    POJ 2230 Watchcow
    codevs 1028 花店橱窗布置
    codevs 1021 玛丽卡
    codevs 1519 过路费
    codevs 3287 货车运输
    codevs 3305 水果姐逛水果街二
    codevs 1036 商务旅行
    codevs 4605 LCA
    POJ 1330 Nearest Common Ancestors
  • 原文地址:https://www.cnblogs.com/hoojjack/p/3847387.html
Copyright © 2011-2022 走看看